私は、10個のスレッドをベクトルにプッシュするプログラムを用意しています。各スレッドは、終了する前に文字を5回印刷するはずです第1のスレッド、第2のスレッドのための「B」など)。私はそれらを一度に(detach()を使用して)実行するか、一度に1つずつ(join()を使用して)実行させることができます。今私はミューテックスを使用して一度に印刷できるスレッドの数を2に制限したいと思っています。私はミューテックスを宣言してロックをかけることができましたが、このような制限をどのように適用するのか分かりません。誰でもどのように進行するかについてのアイデアはありますか?ミューテックスを使用して一度に実行するスレッドの数を制限する2
deque<int> q ;
mutex print_mutex ;
mutex queue_mutex ;
condition_variable queue_cond ;
void begin(int num) {
unique_lock<mutex> ul {queue_mutex};
q.emplace_back(num);
queue_cond.wait(ul,[num]{
return q.front() == num; });
q.pop_front();
cout << num << " leaves begin " << endl ;
}
void end (int num) {
lock_guard<mutex>lg{queue_mutex};
queue_cond.notify_all();
cout << num << " has ended " << endl ;
}
void run(int num, char ch) {
begin(num);
for (int i = 0; i < 5; ++i) {
{
lock_guard<mutex> lg { print_mutex };
cout << ch << endl << flush ;
}
sleep_for(milliseconds(250));
}
end(num);
}
int main() {
vector<thread>threads {};
for (int i = 0; i < 10; ++i) {
threads.push_back(thread{run,i,static_cast<char>(65+i)});
threads.at(i).join();
}
}
実行中のスレッドの数を数えるには、整数が必要です。 –
'detach()'と 'join()'を使って配列を制御するのは間違っています。 'main'の' for'ループは単にスレッドを直列化します。それは無意味です。ループを使用して** all **のスレッドを作成し、その後にスレッドの** **すべてを結合する別々のループを作成します。次に、スレッドがどのようにやり取りするかを理解します。 'detach()'は使わないでください。それは間違いなくあなたが必要とするものではありません。 –
@PeteBecker偉大なキャッチ、それは私の問題でした!優れた説明。私はより良いロック条件を追加しようとしていましたが、別のループに結合を分離するまで何も変わっていませんでした。先に進んで答えたいと思ったら、私はそれを受け入れることができます。 – gmooney8