C ++经常暂停和重启线程的最佳方法是什么?

时间:2014-08-11 10:35:23

标签: c++ multithreading concurrency

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

loop
  wake threads up
  calculate x using the threads
  pause threads
  calculate something else without the threads

这种情况经常发生,确切地说是每秒60次。这就是为什么每次创建新线程都会太慢。我尝试使用每个线程的状态变量(Running,Paused,Stopped)以及带有条件变量的事件类构造或轮询机制来解决这个问题。

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

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

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

2 个答案:

答案 0 :(得分:1)

如果您希望在某些事情发生之前阻止线程,您可以将std::mutex(由std::unique_lock<std::mutex>持有的锁定)与std::condition_variable配对。

您使用std::condition_variable的{​​{3}}成员,将std::unique_lock<std::mutex>传递给它,以及在满足线程唤醒条件时返回true的仿函数。当线程等待std::condition_variable时,它会放弃锁定。满足条件时,wait(假设线程是选择通知的线程)或std::condition_variable上调用notify_one,它会唤醒,重新获取锁定,检查条件,并在/如果它是真的时返回(保持锁定)。

答案 1 :(得分:1)

您可以使用英特尔TBB。如果你的任务很简单,你可以使用一个简单的算法,如parallel_for。 (https://software.intel.com/en-us/blogs/2009/08/03/parallel_for-is-easier-with-lambdas-intel-threading-building-blocks

({{3}})

可以更轻松parallel_for