everyone。 我是新來的信號量,最近我正在學習使用二進制信號量來實現一個簡單的問題,我有一些問題。二進制信號量在C++中同步線程
所以有一個訪問室,一次只有一個人可以進去。在我的設計中有三個人的隊列(這是我創建的所有線程)。例如,在第二隊列中的人訪問該房間之後,下一個要進入房間的人是排在第三隊列中的第一個人,而不是第一隊列的人。給出總人數。離開後,只需簡單地終止線程。
我想創建三個信號來處理這個問題,即在第二個隊列中的一個人進入之後,然後阻塞第二個隊列並且僅僅「發信號」第三個隊列繼續。等等等等。但是,代碼有一些問題。這裏我只是展示一些信號量代碼的一部分。
INT主:
sem_init(&互斥,0,1);
sem_init(& s0,0,1);
sem_init(& s1,0,1);
sem_init(& s2,0,1);
//創建100個並行線程和隨機投入在線程函數隊列0或隊列1或隊列2
for(int i = 0; i<num_thread; i++){
pthread_t curr_thread;
if(queueId == 0){
queue0.push(curr_thread);
}else if(queueId == 1){
queue1.push(curr_thread);
}else if(queueId == 2){
queue2.push(curr_thread);
}
pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&curr_thread, &attr, &thread_function, &queue_Num);
pthread_attr_destroy (&attr);
}
:
void* thread_function (void* arg){
sem_wait(&mutex);
int n = *((int*) arg);
if(n==0){
sem_wait(&s0);
cout << "person in queue" << n << " is visiting" << endl;
sleep(1);
if(!queue0.empty()){
queue0.pop();
}else{
n++;
}
sem_post(&s1);
}else if(n==1){
sem_wait(&s1);
cout << "person in queue" << n << " is visiting" << endl;
sleep(1);
if(!queue1.empty()){
queue1.pop();
}else{
n++;
}
sem_post(&s2);
}else if(n==2){
sem_wait(&s2);
cout << "person in queue" << n << " is visiting" << endl;
sleep(1);
if(!queue2.empty()){
queue2.pop();
}else{
n++;
}
sem_post(&s0);
}
sem_post(&mutex);
return NULL;
}
其實當我運行它,好像我遇到了「僵局」 ,主要完成每次只顯示2個線程。我認爲在thread_function的設計中一定存在一些問題。有沒有人可以幫忙指出並告訴我如何解決它?感謝提前。
嘗試在等待之前放置打印語句,並告訴我您看到了什麼。 – Xymostech
它只是阻止,只顯示一個線程正在訪問,然後主要完成。我只是想知道thread_function的設計是否存在任何問題? – user1878173
你的'queueId'和'queue_Num'是如何定義的? – Xymostech