2008年5月10日 星期六

呼叫pthread_cancel發生segmentation fault

可能是因為pthread_cancel裡面是使用動態記憶體配置,如果拿同一個pthread_t傳入pthread_cancel兩次,那麼第二次呼叫的時候就會收到SIGSEGV信號。這個問題通常是沒做好資源保護,而造成的race condition。

這個pthread_cancel一呼叫後,預設動作並不會馬上就把該thread給停掉,而是在某些system call裡面來做停止的動作,因此這些system call也就是所謂的cancel point。所以使用這個function時候需要非常非常的小心,因此我的建議是在你的一生中,都不要用這個function....。或許太嚴重了,不過真的要非常小心才是。因為還有非常多方法可以避免掉呼叫這個function,來結束一個thread

所以一個thread,最好幫他設計一個Finite State Machine(FSM),藉由狀態的控制,來改變thread的行為。因為FSM的設計可以讓你限定這個Thread的狀態,狀態的切換之間可準確的控制資源的配置與釋放。如果使用一般無組織的flag來決定thread的運作,那這些flag的所有組合,你都要去測試一變,才能知道有無問題。

沒有留言: