2016-05-17 87 views
-2

現狀:如何從等待條件變量/信號量的線程池中喚醒線程?

  1. 線程A調用等待& SEM); //成功
  2. 線程B調用等待& SEM); // blocks
  3. 線程C調用wait& sem); // blocks
  4. Thread A calls signal& sem);

現在呢? 哪個線程被喚醒?

這是隨機的嗎?

但是,我總是希望線程B在線程C之前被喚醒,因爲B在C之前調用了wait。是否存在使用sync的現有機制。機甲?清楚地提及如果需要使用任何其他數據結構!

+2

他們都不在您發佈的例子,因爲*線程A調用wait(&sem); *意味着*線程A調用信號(&sem); *從未達到。如果換成*線程A調用信號(&sem); *有*線程D調用信號(&sem); *,線程A,B或C中的任何一個都會喚醒,並且一般情況下,根本沒有**的控制** –

+0

初始條件:sem初始化爲1,線程A是第一個成功獲得信號量的機器,那麼爲什麼信號(&sem)將不能被達到? –

+0

這將是,根據你改變的初始條件 –

回答

0

其實我正在尋找這樣的東西。 可以使用條件變量實現序列化線程執行。

Mutex M; 
Condition Variable C = 1; 

thread_function_A() 
{ 
    pthread_mutex_lock(M); 

    while (C != 1) 
     pthread_cond_wait(C, M); 

    CRITICAL SECTION STARTS; 
    CRITICAL SECTION ENDS; 
    C++; 
    pthread_mutex_unlock(M); 
} 

thread_function_B() 
{ 
    pthread_mutex_lock(M) 

    while (C != 2) 
     pthread_cond_wait(C, M); 

    CRITICAL SECTION STARTS 
    CRITICAL SECTION ENDS 
    C++; 
    pthread_mutex_unlock(M) 
} 

thread_function_C() 
{ 
    pthread_mutex_lock(M) 

    while (C != 3) 
     pthread_cond_wait(C, M); 

    CRITICAL SECTION STARTS 
    CRITICAL SECTION ENDS 
    C++; 
    pthread_mutex_unlock(M) 
} 
相關問題