我有一個程序將10個線程放到一個向量中,每個向量應該在完成前打印出一個字符5次('A'代表第一個線程,'B'爲第二個,等等)。我可以讓它們一次運行(使用detach())或讓它們一次運行一個(使用join())。現在我想用一個Mutex來限制每次允許打印的線程數爲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'循環只是串行化線程;這是毫無意義的。使用一個循環來創建全部**的線程,然後是一個單獨的循環,用於連接全部**的線程。然後找出你想如何交互的線程。不要使用'detach()';這絕對不是你需要的。 –
@PeteBecker非常棒,那是我的問題!優秀的解釋。我試圖添加一個更好的鎖定條件,但沒有任何更改,直到我將連接分隔到另一個循環。如果你想繼續,並作爲答案張貼,我會很樂意接受它。 – gmooney8