-2
- 線程A調用等待(& SEM); //成功
- 線程B調用等待(& SEM); // blocks
- 線程C調用wait(& sem); // blocks
- Thread A calls signal(& sem);
現在呢? 哪個線程被喚醒?
這是隨機的嗎?
但是,我總是希望線程B在線程C之前被喚醒,因爲B在C之前調用了wait。是否存在使用sync的現有機制。機甲?清楚地提及如果需要使用任何其他數據結構!
現在呢? 哪個線程被喚醒?
這是隨機的嗎?
但是,我總是希望線程B在線程C之前被喚醒,因爲B在C之前調用了wait。是否存在使用sync的現有機制。機甲?清楚地提及如果需要使用任何其他數據結構!
其實我正在尋找這樣的東西。 可以使用條件變量實現序列化線程執行。
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)
}
他們都不在您發佈的例子,因爲*線程A調用wait(&sem); *意味着*線程A調用信號(&sem); *從未達到。如果換成*線程A調用信號(&sem); *有*線程D調用信號(&sem); *,線程A,B或C中的任何一個都會喚醒,並且一般情況下,根本沒有**的控制** –
初始條件:sem初始化爲1,線程A是第一個成功獲得信號量的機器,那麼爲什麼信號(&sem)將不能被達到? –
這將是,根據你改變的初始條件 –