C++ C++;11标准::周期中的线程
我在C++11中有这样一个循环:C++ C++;11标准::周期中的线程,c++,multithreading,c++11,C++,Multithreading,C++11,我在C++11中有这样一个循环: while (true) { std::thread t0(some_work, 0); ... std::thread tn(some_work, n); t0.join(); ... tn.join(); } 但是在每次迭代中创建新线程当然不是件好事。在C语言中,很容易使用消息告诉线程等待另一次迭代,但我想用C++11工具来完成。我查看了条件变量,但我认为这不是解决方案。我能用它做些什么?使用Boost获得
while (true)
{
std::thread t0(some_work, 0);
...
std::thread tn(some_work, n);
t0.join();
...
tn.join();
}
但是在每次迭代中创建新线程当然不是件好事。在C语言中,很容易使用消息告诉线程等待另一次迭代,但我想用C++11工具来完成。我查看了条件变量,但我认为这不是解决方案。我能用它做些什么?使用Boost获得通过!
注意:我没有C++11,因此我将向您展示的代码是针对C++98的。大多数Boost内容最终出现在标准的std::tr1
和后续版本中,因此大部分内容可能在没有Boost的情况下是可以传输的
听起来你有多个线程在不断地分配工作,但不是始终如一地分配。工作并不总是需要执行(否则线程可以在自己的循环中执行),或者线程可能没有执行它的信息。如果是这样的话,考虑一下。< /P>
这样,您将需要创建一个始终运行的线程,因此您可能希望将线程放入类中(尽管不需要)
您可以继续分配所需的工作量。一旦
WorkerThread
s超出作用域,它们将停止运行并很好地关闭Hmm我有一个问题,因为我想在所有线程完成工作后调用一些func(比如apply_changes();),所以我可能需要类似smth的消息
class WorkerThread
{
WorkerThread()
: thread(&WorkerThread::HandleWorkThread, this), io_service(), runThread(true)
{
}
~WorkerThread()
{
// Inform the thread not to run anymore:
runThread = false;
// Wait for the thread to finish:
thread.join();
}
void AssignWork(boost::function<void()> workFunc) { io_service.post(workFunc); }
private:
void HandleWorkThread()
{
while (runThread)
{
// handle work:
io_service.run();
// prepare for more work:
io_service.reset();
}
}
boost::thread thread;
boost::asio::io_service io_service;
bool runThread; // NB: this should be atomic
};
void CalculateThings(int, int);
void CalculateThingsComplex(int, int, double);
// Create two threads. The threads will continue to run and wait for work to do
WorkerThread thread1, thread2;
while (true)
{
thread1.AssignWork(boost::bind(&CalculateThings, 20, 30));
thread2.AssignWork(boost::bind(&CalculateThingsComplex, 2, 5, 3.14));
}