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

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

在做一个项目,特别是大型项目的过程中,多线程运行无可避免。而某一线程发生阻塞可能影响软件的整体运行。在这里,写一个线程用来监测各线程是否有发生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);
相关文章
|
1月前
|
Java 数据库 Android开发
【专栏】Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理
【4月更文挑战第27天】本文探讨了Kotlin在Android开发中的多线程优化,包括线程池、协程的使用,任务分解、避免阻塞操作以及资源管理。通过案例分析展示了网络请求、图像处理和数据库操作的优化实践。同时,文章指出并发编程的挑战,如性能评估、调试及兼容性问题,并强调了多线程优化对提升应用性能的重要性。开发者应持续学习和探索新的优化策略,以适应移动应用市场的竞争需求。
|
8月前
|
安全 Java
【JavaSE专栏76】三态和五态,线程的不同状态:新建、运行、状态、阻塞、等待、计时等待状态
【JavaSE专栏76】三态和五态,线程的不同状态:新建、运行、状态、阻塞、等待、计时等待状态
|
9月前
|
Arthas IDE Java
一种获取阻塞线程栈帧数据的思路
一种获取阻塞线程栈帧数据的思路
133 2
|
1月前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
137 0
|
2天前
|
前端开发 JavaScript
JavaScript异步处理避免了单线程阻塞,如回调函数、Promise和async/await。
【6月更文挑战第22天】JavaScript异步处理避免了单线程阻塞,如回调函数、Promise和async/await。回调是基础,用于在操作完成后执行函数;Promise管理异步状态,支持链式调用;async/await提供同步代码外观,简化错误处理。每种技术在处理耗时任务时都起着关键作用。
9 3
|
5天前
|
Java
【技术解码】Java线程的五味人生:新建、就绪、运行、阻塞与死亡的哲学解读!
【6月更文挑战第19天】Java线程生命周期如同人生旅程,经历新建、就绪、运行、阻塞至死亡五阶段。从`new Thread()`的诞生到`start()`的蓄势待发,再到`run()`的全力以赴,线程在代码中奔跑。阻塞时面临挑战,等待资源释放,最终通过`join()`或中断结束生命。线程的每个状态转变,都是编程世界与哲思的交汇点。
|
27天前
|
设计模式 安全 Java
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
Java 多线程系列Ⅳ(单例模式+阻塞式队列+定时器+线程池)
|
1月前
|
前端开发 JavaScript UED
由于JavaScript是单线程的,因此在处理大量异步操作时,需要确保不会阻塞UI线程
【5月更文挑战第13天】JavaScript中的Promise和async/await常用于处理游戏开发中的异步操作,如加载资源、网络请求和动画帧更新。Promise表示异步操作的结果,通过.then()和.catch()处理回调。async/await作为Promise的语法糖,使异步代码更简洁,类似同步代码。在游戏循环中,使用async/await可清晰管理资源加载和更新,但需注意避免阻塞UI线程,并妥善处理加载顺序、错误和资源管理,以保证游戏性能和稳定性。
35 3
|
1月前
|
存储 网络协议 iOS开发
connect永远阻塞线程及解决方案
connect永远阻塞线程及解决方案
21 0
|
9月前
|
Arthas 测试技术
如何检测由synchronized或Lock引起的线程阻塞问题
如何检测由synchronized或Lock引起的线程阻塞问题
124 1

相关实验场景

更多