2015-03-02 19 views
0

我下面有個問題。一旦我們發出了一個條件變量的信號,我們會繼續執行原始線程嗎?

Process A        Process B 
int A = 0;       int B = 0; 
pthread_mutex_lock(&mutex); 
while (condition == FALSE) 
    pthread_cond_wait(&cond, &mutex); 
            pthread_mutex_lock(&mutex); 
            condition = TRUE; 
            pthread_cond_signal(&cond); 
            pthread_mutex_unlock((&mutex) 
    A += 10;       B += 10; 

我的問題是,如果過程B有其它的說明,例如:INT B + = 10 ;,

乙將執行B + = 10立即或A將採取控制否則?

是的,B進程是繼續執行還是A將被喚醒&取得控制權?

例如,B + = 10會先於A + = 10還是反之?

回答

0

這是一個未定義的行爲。由於您尚未同步訪問權限,因此無法確定哪一個是第一個。儘管在現實生活中它取決於pthread_cond_signal的操作系統實現,但您不應該依賴它。

+0

未指定的行爲。沒有競賽條件。 – rici 2015-03-02 06:26:11

+0

@rici好吧,可能是'未說明'在這裏是更合適的術語,但無論如何它是邪惡的。 – Matt 2015-03-02 06:30:21

+1

爲什麼它是邪惡的?這是多處理。試圖猜測哪個線程是活動的是不明智的,但是有兩個線程同時執行不相關的計算是多線程的本質。 – rici 2015-03-02 06:31:20

1

每個條件變量都與一個互斥量關聯。調用pthread_cond_wait時必須保持互斥鎖; pthread_cond_wait釋放互斥鎖,等待條件發出信號,然後在返回之前重新獲取互斥鎖。

您可以調用pthread_cond_signal並保持互斥鎖,或釋放互斥鎖之後。如果在持有互斥鎖的情況下調用它,則不會繼續執行pthread_cond_wait,直到釋放互斥鎖。

問題中的示例代碼在執行B += 10; [注1]之前不會釋放互斥鎖,因此在A += 10;之前肯定會執行。當然,互斥體必須在某個時候被釋放。

一旦互斥體被釋放,兩個線程都以未指定的順序執行。如果您的計算機有多個核心(現在很常見),它們可能同時執行。


注:

  1. int B += 10;是無效的。你不能聲明一個變量並在一個語句中增加它(變量在哪裏初始化?)
0

你的代碼是不完整的,因爲進程B從不解鎖互斥量。

當進程A執行pthread_cond_wait時,它會自動解鎖互斥鎖並等待進程B的信號。當進程B調用pthread_cond_signal時,進程A將嘗試再次鎖定互斥鎖。由於B永遠不會解鎖這個互斥體,所以A會被卡住以獲取互斥體。

因此,只有B += 10語句會運行。當且僅當進程B解鎖互斥鎖時,A += 10纔會運行。

相關問題