C++ C++;频繁暂停和重新启动线程的最佳方式是什么?

C++ C++;频繁暂停和重新启动线程的最佳方式是什么?,c++,multithreading,concurrency,C++,Multithreading,Concurrency,我有一个任务是非常好的并行化,所以我想使用多线程来加速我的程序。然而,这并不像创建线程并让它们运行那么简单。线程必须重复执行某个任务,中间有中断,即伪代码如下所示: loop wake threads up calculate x using the threads pause threads calculate something else without the threads 这种情况经常发生,准确地说是每秒60次。这就是为什么每次创建新线程都会太慢的原因。我尝试用每个线

我有一个任务是非常好的并行化,所以我想使用多线程来加速我的程序。然而,这并不像创建线程并让它们运行那么简单。线程必须重复执行某个任务,中间有中断,即伪代码如下所示:

loop
  wake threads up
  calculate x using the threads
  pause threads
  calculate something else without the threads
这种情况经常发生,准确地说是每秒60次。这就是为什么每次创建新线程都会太慢的原因。我尝试用每个线程的状态变量(运行、暂停、停止)和带有条件变量的类似事件的构造或轮询机制来解决这个问题

考虑到只有大约5%的时间花在一个关键区域内,这两种方法都只给了我大约两倍的速度,这并不像我想象的那么多。(我的CPU提供4核*2=8超线程)

我可以想象,条件变量的问题是唤醒不是立即的,而是有一些延迟,这意味着运行时被浪费了。轮询方法稍微慢一点,因为我猜,线程暂停时执行的代码会慢一点,因为线程仍在使用CPU


实现我的想法的最佳方法是什么?

如果您希望让线程阻塞直到发生某些事情,您可以将a(其锁由a持有)与a配对


您使用
std::condition_变量的成员
,将
std::unique_lock
传递给它,并使用一个函子,在满足线程唤醒的条件时返回
true
。当线程等待
std::condition\u变量时,它将交出锁。当满足条件时(假设所讨论的线程是为通知选择的线程)或调用
std::condition_变量时,它将唤醒,重新获取锁,检查条件,并在其为真时/如果为真时返回(保持锁)。

您可以使用英特尔TBB。如果您的任务足够简单,您可以使用一种简单的算法,如
parallel\u for
。(
parallel\u for
使用lambas更容易:)

这个问题听起来非常适合线程池和基于任务的多线程处理。特别是当多线程工作单元在计算时间上有很大差异时。问题仍然是:线程池将如何实现?你应该看看你是对整个程序计时还是只对线程部分计时?您需要考虑您的期望。@AndreasT Intel TBB是一个很好的方法。我的问题是,除了您所描述的方法之外,是否还有更好的(读“更快”)方法来实现此功能。我尝试对每个方法进行并行处理,它比我自己的两个实现稍微快一点,但仍然没有我预期的那么快。我可能会再次查看代码,也许我发现了一个奇怪的瓶颈。