我有一个程序将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