首页 > 解决方案 > 检测线程是否被操作系统中断

问题描述

在一个应用程序中,我需要定期读取 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 中是否有检测程序是否中断的方法?(除了在实际基础上检查单调时钟并定义合理阈值的简单解决方案)

标签: c++multithreadingboost

解决方案


没有现代的通用操作系统提供这种机制,在每次被抢占时通知它们的执行线程;C++ 核心库中肯定没有任何东西可以做到这一点。这超出了 C++ 库的范围。事实上,操作系统不遗余力地给每个执行线程一个它在连续运行的错觉。

有一些虚荣的、专用的操作系统为运行进程提供实时保证,它们的执行线程具有专用的、不间断的 CPU 时间。

这种能力必须被设计到操作系统本身中。它没有标准化的 C++ 接口。如果这是针对您正在使用的实时操作系统 ( RTOS ),您需要查阅其文档以获取更多信息。如果您的程序需要这种功能,您最好的选择是使用旨在支持它的操作系统。


推荐阅读