2017-03-08 4 views
0

機能するスレッドIDを渡す私は2つの方法で同時キューを実装:(エンキュー)を追加& (デキュー)を除去します。C++:異常

2つのスレッドを使用して実装をテストするには、getRandom()というメソッドで0と1の間に10(NUMBER_OF_OPERATIONS)の乱数を生成しました。これにより、追加および削除操作の異なるディストリビューションを作成することができます。

doWorkメソッドは、スレッド数で行われた作業を分割します。

問題: main関数から渡しているthreadIDが、doWorkメソッドが受け取るthreadIDと一致しません。ここではいくつかのサンプルの実行は、次のとおりです。

Output 1

Output 2あなたが参照によってiをキャプチャしている。このラインで

#define NUMBER_OF_THREADS 2 
#define NUMBER_OF_OPERATIONS 10 

int main() { 

     BoundedQueue<int> bQ; 
     std::vector<double> temp = getRandom(); 
     double* randomNumbers = &temp[0]; 
     std::thread myThreads[NUMBER_OF_THREADS]; 

     for(int i = 0; i < NUMBER_OF_THREADS; i++) { 
      cout << "Thread " << i << " created.\n"; 
      myThreads[i] = std::thread ([&] { bQ.doWork(randomNumbers, i); }); 
     } 

     cout << "Main Thread\n"; 

     for(int i = 0; i < NUMBER_OF_THREADS; i++) { 
      if(myThreads[i].joinable()) myThreads[i].join(); 
     } 
     return 0; 
    } 

    template <class T> void BoundedQueue<T>::doWork (double randomNumbers[], int threadID) { 

     cout << "Thread ID is " << threadID << "\n"; 
     srand(time(NULL)); 
     int split = NUMBER_OF_OPERATIONS/NUMBER_OF_THREADS; 
     for (int i = threadID * split; i < (threadID * split) + split; i++) { 
      if(randomNumbers[i] <= 0.5) { 
       int numToAdd = rand() % 10 + 1; 
       add(numToAdd); 
      } 
      else { 
       int numRemoved = remove(); 
      } 
     } 
    } 

答えて

3

は:

myThreads[i] = std::thread ([&] { bQ.doWork(randomNumbers, i); }); 

これは、他のスレッドの実行時にあることを意味しますラムダ、それは、それが作成されたときの値ではなく、私の最新の値を取得します。代わりに、値によってそれをキャプチャ:あなたが読んでiへの書き込み順不同持っているよう

myThreads[i] = std::thread ([&, i] { bQ.doWork(randomNumbers, i); }); 

いただきまし悪化し、あなたの現在のコードはbehavoirを未定義ました。そして、他のスレッドがそれを読む前に、iがメインスレッドのスコープから外れている可能性があります。上記の修正により、これらの問題はすべて修正されています。

+1

明示的に言えば、スレッドの起動とスレッドの実行スレッド機能の間には遅延があります。そしてスレッドコンストラクタは、スレッドが生成されるとすぐに制御を返します。したがって、スレッド関数が実行される前に多くの変数を実際に変更することができます。 –

+1

これはそれでした。マイクありがとう! – John

+0

@Revolver_Ocelot私はマルチスレッドプログラミングには触れていない。それはここで懸念の源ですか? – John

関連する問題