2013-08-30 37 views
0

================線程1如果調用pthread_cond_wait能損失信號時調用pthread_cond_signal信號之前

pthread_mutex_lock(&mutex); 
do 
{ 
    fun();//this fun will cost a long time, maybe 1-2 second 
    gettimeofday(&now, NULL); 
    outtime.tv_sec = now.tv_sec + 5; 
    outtime.tv_nsec = now.tv_usec * 1000; 
    int ret = pthread_cond_timedwait(&cond, &mutex, &outtime);  
} while((!predicate && ret != ETIMEDOUT) 
pthread_mutex_unlock(&mutex); 

============= =============線程2

pthread_mutex_lock(&mutex); 
predicate = true; 
pthread_cond_signal(&cond); 
pthread_mutex_unlock(&mutex); 

如果線程2線程1的樂趣(在發出一個信號),沒有那麼pthread_cond_timedwait,當樂趣()調用返回時,線程1的phread_cond_timedwait仍然可以獲取thread2之前發送的信號還是不?我們可以在while()中的pthread_cond_timedwait之前調用一個耗時的樂趣嗎?

回答

1

如果pthread_cond_signal在沒有線程正在等待信號時被調用,則它不起作用。該信號未被儲存供將來使用。

如果predicate爲真,則循環中的代碼不應等待條件變量。

+0

感謝pete becker,你如何看待我在循環中調用的fun(),我認爲這是錯誤的,不應該調用任何耗費時間的函數。但是我做了一個測試程序,信號可以通過pthread_cond_wait接收,即使信號在沒有pthread_cond_wait時發送,但我不確定它是否可以一直接收。 –