Используйте Boost, чтобы пройти!
Примечание: У меня нет C++ 11, поэтому код, который я вам покажу, предназначен для C++ 98 с Boost libraries
. Большинство материалов Boost попадают в std::tr1
и впоследствии более поздние версии стандарта, поэтому большинство из них, вероятно, передаются без повышения.
Похоже, что у вас есть несколько потоков, которые вы постоянно, но не последовательно, назначая работу. Работа не всегда требует выполнения (иначе ваш поток мог бы сделать это в своем собственном цикле), или, возможно, нить не имеет информации для ее выполнения. Если это так, рассмотрите boost::asio::io_service
.
С этим вам необходимо создать поток, который всегда работает, поэтому вы, вероятно, захотите поместить свои потоки в класс (хотя вам и не нужно).
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));
}
Вы можете продолжать назначать столько работы, сколько необходимо. Как только WorkerThread
s выйдут из сферы действия, они прекратят работать и закрываются красиво
такая хорошая мысль! thx –
Хм, у меня проблема, потому что я хочу, чтобы mainstream вызывал некоторый func (например, apply_changes();) после того, как все потоки закончат их работы, поэтому мне нужны smth-сообщения, возможно –