2016-03-29 36 views
-1

毎回、複数のワーカースレッドW [1..10]は、メインスレッドから通知されて作業を開始するまでアイドル状態になっています。それぞれの仕事をし、彼らが完了したことを主人公に伝え、前にあった待機状態に戻ります。メインスレッドは、ワーカースレッドが作業をしている間に待たれているはずです。スレッドプールの同期化

私はこれをstd::condition_variable ann std::mutexを使用して実行しようとしましたが、失敗しました。ブーストや他のハイレベルライブラリを使用しないで、問題に適切なアプローチは何ですか? パフォーマンス上の理由から、すべてのステップでスレッドを生成したり結合したりしないようにしたいと考えています。ありがとうございます。

編集:

const size_t thread_num = 10; 

int busy_count = thread_num; 

std::condition_variable cv; 
std::mutex cv_m; 

std::condition_variable cv_lock1; 
std::mutex cv_m_lock1; 


bool lock_1; 

bool end_all = false; 

void wthread() 
{ 
    do {   
     { 
      std::unique_lock<std::mutex> lk(cv_m_lock1); 
      cv_lock1.wait(lk, []{return lock_1 == false; }); 
     } 

     if (end_all) 
     { 
      std::cout << "exit\n"; 
      return; 
     } 

     // do work 

     {   
      std::lock_guard<std::mutex> lk(cv_m); 
      busy_count--; 
      std::cout << busy_count << " ";   
     }  
     cv.notify_all(); 

     { 
      std::unique_lock<std::mutex> lk(cv_m_lock1); 
      cv_lock1.wait(lk, []{return lock_1 == true; }); 
     } 



    } while (true); 
} 

int _tmain(int argc, _TCHAR* argv[]) 
{  
    std::thread *t[thread_num]; 

    lock_1 = true; 

    for (unsigned int i = 0; i < thread_num; i++) 
     t[i] = new std::thread(wthread); 

    for (int i = 0; i < 10; i++) 
    { 
     busy_count = 10;    

     lock_1 = false;  
     cv_lock1.notify_all();  

     { 
      std::unique_lock<std::mutex> lk(cv_m); 
      cv.wait(lk, []{return busy_count == 0; }); 
     } 

     lock_1 = true;  
     cv_lock1.notify_all(); 
    } 

    end_all = true; 
    lock_1 = false; 
    cv_lock1.notify_all(); 


    for (unsigned int i = 0; i < thread_num; i++) 
     t[i]->join(); 

    return 0; 
} 
+0

正しいアプローチは、それを避けるためにデザインを変更することです。これはまさにマルチスレッドコードで避けたい状況のようなものです。 –

+0

_ "私はstd :: condition_variable ann std :: mutexを使用してこれを実行しようとしていましたが、失敗しました。" _これを行う通常の方法です。あなたが具体的に何をやっているのか、それがどこで失敗したのか、私たちにここに示してください。 –

+0

私はコードを追加しました。どのようにデザインを変更しますか?私は正しい方向を指していることに満足しています。 – user3049681

答えて

1

何か

std::thread thread1([](){/*do something*/}); 
std::thread thread2([](){/*do something*/}); 
std::thread thread3([](){/*do something*/}); 
thread1.join(); 
thread2.join(); 
thread3.join(); 

などのメインスレッドは、スレッド1..3仕上げ加工まで待機します。それらのスレッドは同時に動作します

+0

あなたの答えをありがとう。これまでのやり方はかなり似ていますが、スレッドの作成と結合にかなりのオーバーヘッド(約2〜3ms)があり、ワーカースレッドを永続化することで回避することを望んでいました。 – user3049681