写一个线程来监控各线程是否发生阻塞

写一个线程来监控各线程是否发生阻塞

文章目录

  • 写一个线程来监控各线程是否发生阻塞
    • 原理
    • 接口说明
    • 源码
    • 使用示例

在做一个项目,特别是大型项目的过程中,多线程运行无可避免。而某一线程发生阻塞可能影响软件的整体运行。在这里,写一个线程用来监测各线程是否有发生hang的情况,在项目中应用,可以帮助定位具体发生问题的线程。

原理

  1. 监测的线程运行时,根据线程执行频率,更新线程的当前时间 thread_time
  2. 给一个超时时间 timeout_time
  3. 在监听线程中不断check当前时间 now_time 是否大于 thread_time + timeout_time
  4. 如果 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);

你可能感兴趣的:(C++,多线程,c++)