如何检测线程被操作系统中断 保障std::chrono两类时钟读取间隔最小
关于boost::thread_interrupted的触发范围
boost::thread_interrupted仅在其他线程主动调用目标boost::thread对象的interrupt()方法时才会触发,属于纯用户态的线程中断机制,和操作系统层面的调度抢占、时间片轮转导致的线程挂起完全无关,无法用来检测你说的两次时钟读取间隙是否被操作系统中断。
STL/Boost是否有对应检测能力
STL没有提供跨平台的、可以检测代码段执行期间是否被操作系统调度中断的通用接口,这类能力属于操作系统内核提供的平台相关特性,不在C++标准库和Boost通用组件都没有封装对应功能。
可行的替代实现方案(排除你提到的单调时钟阈值校验方案
你可以通过操作系统提供的线程上下文切换统计接口实现检测逻辑,不同平台的实现方式如下:
- Linux平台:使用
getrusage系统调用读取线程的非自愿上下文切换计数:
#include <sys/resource.h> #include <chrono> #include <iostream> bool is_context_switched() { static long long last_nivcsw = 0; struct rusage usage; getrusage(RUSAGE_THREAD, &usage); long long current = usage.ru_nivcsw; bool ret = current != last_nivcsw; last_nivcsw = current; return ret; } int main() { is_context_switched(); // 先重置计数基准 auto time_system = std::chrono::system_clock::now(); auto time_monoton = std::chrono::steady_clock::now(); if (is_context_switched()) { std::cout << "时钟读取间隙被操作系统中断!" << std::endl; } else { // 执行后续逻辑 } return 0; }
ru_nivcsw字段记录了线程被操作系统强制抢占的次数,两次调用计数不变就说明时钟读取期间没有被调度打断。
- Windows平台:可以调用
QueryThreadCycleTime接口读取线程的CPU执行周期计数,代码段执行前后对比计数差值,如果差值和两次时钟读取的理论CPU开销匹配说明没有被抢占,也可以通过NtQueryInformationThread接口读取线程的上下文切换计数实现检测。
如果你的需求是尽可能降低两次时钟读取被打断的概率,还可以配合以下操作:
- 将线程绑定到固定CPU核心执行,避免跨核心调度
- 临时提升线程调度优先级为最高等级,Linux下可以使用实时调度策略(需要管理员权限)
内容的提问来源于stack exchange,提问作者flashbanger
相关产品推荐
相关产品推荐

