2012-12-05 78 views
2

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的設計中一定存在一些問題。有沒有人可以幫忙指出並告訴我如何解決它?感謝提前。

+0

嘗試在等待之前放置打印語句,並告訴我您看到了什麼。 – Xymostech

+0

它只是阻止,只顯示一個線程正在訪問,然後主要完成。我只是想知道thread_function的設計是否存在任何問題? – user1878173

+0

你的'queueId'和'queue_Num'是如何定義的? – Xymostech

回答

0

當您將queueId傳遞給線程時,您不希望將它傳遞給您的某個局部變量的指針,因爲您將快速更改。而應該只是在整數本身傳遞給你的線程:

pthread_create(&curr_thread, &attr, &thread_function, (void*)queueId); 
             // Pass queueId the int, not a pointer 

然後,當你需要在你的線程讀取值,只投了void*回一個整數:

void* thread_function (void* arg){ 
    ... 

    int n = (long)arg; 

    .. 
} 

在此之後,你的代碼對我來說很好。

+0

輸出只顯示「person1正在訪問」,然後程序結束......其他線程的狀態如何?我創建了10個線程進行測試,它應該彈出10次,告訴我哪個人進入..時間..或者你可以離開你的聯繫人,也許電子郵件地址,我可以發送代碼給你看看 – user1878173