在做一个项目,特别是大型项目的过程中,多线程运行无可避免。而某一线程发生阻塞可能影响软件的整体运行。在这里,写一个线程用来监测各线程是否有发生hang的情况,在项目中应用,可以帮助定位具体发生问题的线程。
原理
- 监测的线程运行时,根据线程执行频率,更新线程的当前时间 thread_time
- 给一个超时时间 timeout_time
- 在监听线程中不断check当前时间 now_time 是否大于 thread_time + timeout_time
- 如果 now_time > thread_time + timeout_time,说明线程已经有 timeout_time 的时间没有执行,说明该线程发生了hang
接口说明
1. void SetMonitor(pthread_t _id, int _miliTimeout);
- 在要监测的线程中使用,随着线程的运行频率调用该接口更新当前线程的时间
- _id:监测的线程id
- _miliTimeout:超时时间
2. void Process();
- 在监听线程中使用,不断check线程是否满足发生hang的条件
3. void Stop();
- 停止check线程是否满足发生hang的条件
源码
源码下载链接:https://download.csdn.net/download/Attitude93/12205063
使用示例
例如要监测主线程是否发生hang:
CThreadMonitor *mon = CThreadMonitor::instance(); pthread_t th_id; int ret = pthread_create(&th_id, NULL, ThreadMonitor, (void *)mon); if (ret) { printf("create thread monitor fail\n"); return; } printf("start..."); //======== 下面的代码在线程循环中,不断更新线程当前时间 ================= // about 3 seconds, we can decide the main thread is in hang ( this is a example ) mon.SetMonitor(pthread_self(), 3500);