나는 10 개의 스레드를 벡터로 푸시하는 프로그램이 있습니다. 각 스레드는 완료 전에 문자를 5 번 인쇄합니다 ('A'는 첫 번째 스레드, 두 번째 스레드의 'B'등). 나는 한 번에 (detach()를 사용하여) 모두 실행 시키거나 한번에 하나씩 (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' 루프는 단순히 스레드를 직렬화합니다; 그것은 무의미하다. 루프를 사용하여 모든 ** 스레드를 작성한 다음 스레드의 ** 모든 ** 스레드를 결합하는 별도의 루프를 작성하십시오. 그런 다음 스레드가 상호 작용하는 방식을 파악하십시오. 'detach()'를 사용하지 마십시오; 확실히 당신이 필요로하는 것이 아닙니다. –
@ PeteBecker 큰 문제는 내 문제였습니다! 훌륭한 설명. 더 나은 잠금 조건을 추가하려고 시도했지만 다른 루프로 결합을 분리 할 때까지 아무 것도 변하지 않았습니다. 계속 진행하고 싶다면 답변으로 받아 들일 수있어서 기쁩니다. – gmooney8