2012-04-21 65 views
2

我有這個簡單的互斥鎖/等待等待類包裝的問題。 我用它來保護連接的客戶端的隊列,並在等待狀態,有連接新客戶通知線程,但應用與分割在互斥鎖等待類錯誤或錯誤

client_socket_fd = clients_for_threads_q.front(); 

失敗墜毀時,其正在只是壓力測試(很多客戶端連接)

在線程等待:ptotected上書寫

MUTEXCONDSIGNAL_for_workers.lock(); 
    if (clients_for_threads_q.empty()) 
    { 
     MUTEXCONDSIGNAL_for_workers.wait_signal(); 
    } 

    client_socket_fd = clients_for_threads_q.front(); // CRASHED !!!! 
    clients_for_threads_q.pop(); 
    MUTEXCONDSIGNAL_for_workers.unlock(); 
當然clients_for_threads_q的

回答

4

pthread_cond_wait可能有虛假的起牀。

當使用條件變量時,總是有一個布爾謂詞涉及與每個條件關聯的共享變量,如果線程應繼續執行,則爲true。 可能會發生pthread_cond_wait()或pthread_cond_timedwait()函數的虛假喚醒。由於從pthread_cond_wait()或pthread_cond_timedwait()返回並不意味着這個謂詞的值有任何意義,所以應該在返回時重新評估謂詞。

你需要改變你的服務員if條件的循環:

while (clients_for_threads_q.empty()) 
{ 
    MUTEXCONDSIGNAL_for_workers.wait_signal(); 
} 
+0

喔,謝謝,我打破了我的大腦! :) – abrahab 2012-04-21 23:41:02