C -線程

編譯器的一些知識

xcode編譯器介紹
gnu ,gcc ,clang ,llvm區別與聯繫

線程的生命週期

線程的生命週期

主線程

1.  main函數執行時候,主線程啓動, 當main函數退出時候,主線程結束。同時,進程內所有的線程也會結束,主線程中調用pthread_exit ,此時, 主線程會等待所有線程完成之後結束。
2.  主線程接受參數的方式爲argc, argv ,一般線程接受參數的方式爲void*  (void * 爲任意類型指針,是否相當於c中的id類型。)
3.  絕大多數情況下 ,主線程在一個默認的堆棧上執行,其大小將會增長到足夠的長度 ,而一般的線程是受限制的 ,一旦溢出 ,會出錯。

線程的創建

1. 主線程在進程創建時候創建。
2. 一般線程會通過調用函數pthread_create來進行創建 。
3. ***新的線程可能在pthread_create返回之前已經開始運行, 甚至新的線程會在當前pthread_create函數返回之前已經運行完畢了。***

線程的狀態

  1. 線程的4種狀態
狀態 含義
就緒 線程能夠運行,但是在等待可用的處理器
運行 線程正在運行,在多核處理器中,可能同時多個線程運行
阻塞 線程在等待處理器以外的其他條件
終止 線程從啓動函數中返回 ,或調用pthread_exit函數 ,或被取消

2. 線程的回收
1. 線程的分離屬性 :分離一個線程時候,並不影響他,而是通知當前系統線程結束時候,其所使用的資源可以回收。沒有被分離的進程終止時候回保留它的虛擬 ,保留堆棧信息和其他系統資源 ,這種線程成爲‘殭屍線程’ ,線程
2. 終止被分離的線程會釋放所有的系統資源,但是你必須釋放由該線程佔有的程序資源。由malloc或者mmap分配的內存可以在任何時候由任何線程釋放,條件變量、互斥量、信號燈可以由任何線程銷燬,只要他們被解鎖了或者沒有線程等待。但是隻有互斥量的主人才能解鎖它,所以在線程終止前,你需要解鎖互斥量

線程有兩種退出方式,有可能自己退出的,這是正常的退出方式,也有可能是非正常退出的,例如被其他線程取消,
試想一下,如果一個線程已經上鎖了,還沒解鎖就被其他線程取消了,那這個鎖就一直鎖着,沒辦解開。因爲就需要在互斥鎖上鎖前使用
pthread_cheanup_push(),這個函數可以在線程在非正常退出時,丟用指定函數來進行相應操作(解鎖)
若線程並沒有在互斥鎖上鎖時被非正常退出,就要調用 pthread_cleanup_pop()來取消pthread_cleanup_push()的操作。pthread_cleanup_pop一般用再解鎖之後
所以這兩個函數都是一對出現的
每個線程之間的棧是相互獨立的,每個線程都擁有自己的棧區,雖然說它們的棧都是從進程空間的棧中分配的並且共享進程的棧,但是在創建線程的時候,每個線程都從進程棧區那兒獲得一個私有的棧區。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章