c++ - boost 线程 : is it possible to limit the run time of a thread before moving to another thread

标签 c++ multithreading boost boost-thread

我有一个带有 线程和诊断 线程的程序。主线程基本上是一个执行各种任务的while(1) 循环。其中一项任务是为诊断引擎提供有关系统的信息,然后稍后(即在下一个循环中)检查是否有任何问题需要处理。主循环的一次迭代不应超过 0.1 秒。如果一切顺利,那么诊断引擎几乎不会花时间返回答案。但是,如果出现问题,诊断引擎可能需要几秒钟的时间来隔离问题。因此,每次诊断引擎接收到新信息时,它都会启动一个新的诊断线程。

我们遇到的问题是诊断线程正在从主线程中窃取时间。实际上,即使我们有两个线程,主线程也无法像我希望的那样频繁运行,因为诊断线程仍在旋转。

使用 Boost 线程,是否可以限制一个线程在移动到另一个线程之前可以运行的时间量?这里同样重要的是我们使用的诊断算法是黑盒,所以我们不能在里面放任何线程代码。谢谢!

最佳答案

如果你运行多个线程,它们确实会消耗 CPU 时间。如果您只有一个处理器,并且一个线程正在执行处理器密集型工作,那么该线程将减慢其他线程上完成的工作。如果您使用特定于操作系统的工具来更改线程优先级,那么您可以使诊断线程的优先级低于主线程。此外,您提到诊断线程正在“旋转”。你的意思是它确实具有像这样的自旋等待的等价物:

while(!check_done()) ; // loop until done

如果是这样,我强烈建议您尽量避免这种忙等待,因为它会消耗 CPU 时间而无济于事。

但是,尽管多个线程可能会导致彼此变慢,但如果您看到几秒钟的实际延迟,则表明存在另一个问题,并且主线程实际上正在等待诊断线程完成。检查诊断线程对 join() 的调用是否在主循环之外。

另一种可能性是诊断线程正在锁定主线程循环所需的互斥量。检查锁定了哪些互斥体以及锁定位置。

要真正提供帮助,我需要查看一些代码。

关于c++ - boost 线程 : is it possible to limit the run time of a thread before moving to another thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3743985/

相关文章:

c++ - 为什么 std::cout 在线程中被抢占但 printf 却没有?

Java - 同步是否需要 volatile ?

c++ - 没有测试用例的Boost单元测试框架

c++ - 无法找出 C++ 中 Caesar Cipher 的问题

c++ - ShellExecute:Verb "runas"不适用于路径中包含空格的批处理文件

java - Android 将字符数组发送到 JNI C++

c++ - boost 指针容器插入(ptr_list)

c++ - 链表类

multithreading - await Task.WhenAll() 与 Task.WhenAll().Wait()

c++ - 如何在 C++ 和 Boost 中将数组参数传递给 TCP 客户端的函数