我有一个带有主 线程和诊断 线程的程序。主线程基本上是一个执行各种任务的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/