【问题标题】:Detect if a thread has been interrupted by OS检测线程是否被操作系统中断
【发布时间】: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_systemtime_monoton不会被直接获取。

是否有例如一个线程状态变量,可用于在程序段之间重置并检查线程是否已被操作系统中断。

我发现 boost::threads 可以抛出一个boost::thread_interrupted-Exception,但我不完全理解这个异常是否仅在其他线程主动调用中断()方法或操作系统时才抛出中断 prgroams 进程及其线程。

STL 或 Boost 中是否有检测程序是否中断的方法? (除了在实际基础上检查单调时钟并定义合理阈值的简单解决方案)

【问题讨论】:

  • 被打断并不是在线程范围内发生的事情,对于大多数目的来说——它实际上是 CPU 做的并且故意对你隐藏的事情。即使线程没有取消调度,或者迁移到另一个内核,也可能在两行之间发生中断并直接返回控制权
  • 如果你想控制这些东西,你需要做一些特定于平台的工作(例如,cpu 隔离、调度程序类和优先级)。如果你只是想检测它......你可以为每个时间戳拍摄几个连续的快照,看看它们是否一致
  • 那么你到底想要什么——检测是否发生了某种类型的中断?什么类型,只是取消计划或任何中断?还是您想防止问题出现?

标签: c++ multithreading boost


【解决方案1】:

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

有一些虚荣心,special-purpose operating systems 为正在运行的进程提供实时保证,并为其执行线程提供专用的、不间断的 CPU 时间。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    相关资源
    最近更新 更多