【发布时间】:2021-10-24 15:37:43
【问题描述】:
在应用程序中,我需要定期读取 std::chrono 的单调时钟和系统时钟,并以尽可能小的延迟在其间进行。
像这样:
#include <iostream>
#include <chrono>
int main() {
bool interrupted = false;
auto time_system = std::chrono::system_clock::now();
auto time_monoton = std::chrono::steady_clock::now();
if (interrupted) {
std::cout << "Thread had been interrupted between clock reading!" << std::endl;
}
else {
//do stuff
}
return 0;
}
当然,程序在捕获时钟值之间被操作系统中断的可能性仍然很小,然后time_system和time_monoton不会被直接获取。
是否有例如一个线程状态变量,可用于在程序段之间重置并检查线程是否已被操作系统中断。
我发现 boost::threads 可以抛出一个boost::thread_interrupted-Exception,但我不完全理解这个异常是否仅在其他线程主动调用中断()方法或操作系统时才抛出中断 prgroams 进程及其线程。
STL 或 Boost 中是否有检测程序是否中断的方法? (除了在实际基础上检查单调时钟并定义合理阈值的简单解决方案)
【问题讨论】:
-
被打断并不是在线程范围内发生的事情,对于大多数目的来说——它实际上是 CPU 做的并且故意对你隐藏的事情。即使线程没有取消调度,或者迁移到另一个内核,也可能在两行之间发生中断并直接返回控制权
-
如果你想控制这些东西,你需要做一些特定于平台的工作(例如,cpu 隔离、调度程序类和优先级)。如果你只是想检测它......你可以为每个时间戳拍摄几个连续的快照,看看它们是否一致
-
那么你到底想要什么——检测是否发生了某种类型的中断?什么类型,只是取消计划或任何中断?还是您想防止问题出现?
标签: c++ multithreading boost