一般線程的結束是由進程內的其他線程來結束的,調用pthread_cancel.
但是需要考慮到被結束線程的性質,一方面,線程是可被結束,也可無法結束,即不響應該信號;另一方面,如果線程是可被結束的,那麼結束的方式有兩種,一種是同步,當線程收到這個信號的時候先掛起,等到下一個取消點時再響應該信號,另一種是異步,收到這個信號時,線程立即結束。
注意:線程默認是可被取消,同步結束。
什麼是取消點?
取消點是很多的系統調用,pthread_join,write等很多系統調用,包括很多的庫函數調用,printf等,因為printf中有前面所說的系統調用write。
是不是取消點我覺得可以自己做一個簡單地測試。
為什麼要考慮線程的性質呢?
考慮以下情況:
父線程A和子線程B(未設置異步結束),共同訪問資源C,父線程結束子線程B,但是pthread_cancel只是發送信號,接著父線程接著釋放資源C,當B恢復運行時,由於不是直接結束而會等待下一個取消點,而在下一個取消點前,B訪問了資源C,此時程序就會崩潰。
所以線程間的同步,要麼設置子線程異步結束,或者父線程等待子線程結束的信號。
附:
設置線程同步結束還是異步結束接口:
int pthread_setcanceltype(int type, int *oldtype);
type可取值異步PTHREAD_CANCEL_ASYNCHRONOUS 同步PTHREAD_CANCEL_DEFERRED oldtype返回原先的屬性
。