程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 由pthread_create引起的段錯誤,pthread_create引起

由pthread_create引起的段錯誤,pthread_create引起

編輯:關於C語言

由pthread_create引起的段錯誤,pthread_create引起


一般線程的結束是由進程內的其他線程來結束的,調用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返回原先的屬性

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved