機能するスレッドIDを渡す私は2つの方法で同時キューを実装:は(エンキュー)を追加& は(デキュー)を除去します。C++:異常
2つのスレッドを使用して実装をテストするには、getRandom()というメソッドで0と1の間に10(NUMBER_OF_OPERATIONS)の乱数を生成しました。これにより、追加および削除操作の異なるディストリビューションを作成することができます。
doWorkメソッドは、スレッド数で行われた作業を分割します。
問題: main関数から渡しているthreadIDが、doWorkメソッドが受け取るthreadIDと一致しません。ここではいくつかのサンプルの実行は、次のとおりです。
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();
}
}
}
明示的に言えば、スレッドの起動とスレッドの実行スレッド機能の間には遅延があります。そしてスレッドコンストラクタは、スレッドが生成されるとすぐに制御を返します。したがって、スレッド関数が実行される前に多くの変数を実際に変更することができます。 –
これはそれでした。マイクありがとう! – John
@Revolver_Ocelot私はマルチスレッドプログラミングには触れていない。それはここで懸念の源ですか? – John