2012-07-07 54 views
0

在我的問題中,我使用pthread_create()創建一個pthread,比如myThread。pthread更新一個公共變量

它們都爲主線程共享一個公共變量「done」,以告訴myThread停止從套接字讀取數據。

在我的並行線程

,我有一個循環:

// done is a common variable 
while (!done && socket->read(&buffer) == OK) { 
    // do something.... 
} 

有些時候,我想告訴MyThread的停止從套接字讀取,所以我做的:

done = true; 
    void *test; 
    pthread_join(myThread, &test); 

這會不會導致比賽條件?即myThread會在阻塞讀取調用之前看不到我的主線程更新'done'的值?

回答

0

在一個線程中寫入一個變量並在另一個線程中讀取它需要同步(例如互斥鎖)以避免競爭條件。

如果這是一個真實的套接字而不是奇怪的對象,請考慮調用shutdown()來斷開連接並喚醒被阻塞的線程,同時保持文件描述符有效,請參閱Wake up thread blocked on accept() call。讀取失敗後,myThread鎖定互斥鎖並檢查完成的變量。

其他方法包括在套接字上調用poll()以及傳遞關閉消息的管道。