2015-05-18 2 views
-4

У меня есть цикл в 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. Я посмотрел на condition_variable, но это не решение, я думаю. Что я могу сделать с этим?

ответ

0

Используйте 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 выйдут из сферы действия, они прекратят работать и закрываются красиво

+0

такая хорошая мысль! thx –

+0

Хм, у меня проблема, потому что я хочу, чтобы mainstream вызывал некоторый func (например, apply_changes();) после того, как все потоки закончат их работы, поэтому мне нужны smth-сообщения, возможно –

Смежные вопросы