2011-02-17 108 views
1

這是pthread_cond_wait手冊頁的摘錄 某些實現,特別是在多處理器上的實現,有時可能會導致多個線程在不同處理器上同時發送條件變量時喚醒。pthread_singal在多處理器系統上喚醒多個線程

在一般情況下,只要條件等 返回時,線程必須重新評估 與 條件等待相關的謂詞,以確定它是否 可以安全地進行,應該等待再次, 還是應該宣佈超時。我 問題:?這裏是什麼 謂詞的意思是否意味着我需要 從 在 調用pthread_cond_wait提供的條件變量創建相隔一個多變量或做它指哪 已經提供了相同的變量在 調用pthread_cond_wait

回答

1

是的,你需要像int done_flag;一個額外變量,使用這樣的:

pthread_mutex_lock(&mutex); 
while (!done_flag) pthread_cond_wait(&cond, &mutex); 
/* do something that needs the lock held */ 
pthread_mutex_unlock(&mutex); 
/* do some other stuff that doesn't need the lock held */ 

當然,它通常不是一面旗幟,而是一個計數或其他類型的變量,具有更復雜的測試條件。

1

這可能會有用。你可以使用pthread_kill來喚醒特定的線程。

sigset_t _fSigMask; // global sigmask 

在創建我們的主題之前,我們會這樣做。線程從創建它們的線程繼承它們的掩碼。我們使用SIGUSR1來表示我們的線程。其他信號可用。

sigemptyset(&_fSigMask); 
sigaddset(&_fSigMask, SIGUSR1); 
sigaddset(&_fSigMask, SIGSEGV); 

然後睡個線程

int nSig; 
sigwait(&fSigMask, &nSig); 

然後喚醒線程,YourThread。

pthread_kill(YourThread, SIGUSR1); 

順便說一下,在我們的測試中,這種睡眠和喚醒線程的速度比使用條件變量快40倍。