Linux--線程【菜鳥學習日記】

線程與進程一樣,具有創建、退出、取消和等待等基本操作,可以獨立完成特定事物的處理;線程同樣有自己的特有屬性,如線程也有唯一標識自己的線程ID,但線程佔用更少的資源


什麼是線程?線程的定義

“輕量級進程”
簡單來說線程就是進程中的一個執行流,更準確來說:線程是“一個進程內部的控制序列”

  • 進程是資源競爭的基本單位
  • 線程是程序執行的最小單位

創建線程

int pthread_create(pthread_t *newthread,    
                   const pthread_attr_t *attr,  //NULL
                   void*(*start_routine)(void*),//線程要執行的函數
                   void *arg);  
//newthread:線程ID
//attr:設置線程的屬性,主要設置與棧相關的屬性,一般情況下設置爲NULL,使用系統默認屬性
//start_routine:線程運行的代碼起始地址,就是要運行的那個函數
//arg:運行函數的參數地址。如果需要傳入多個參數,則需要使用一個包含這些參數的結構體地址

返回:成功返回0,失敗返回非0

這裏寫圖片描述


線程的退出

//線程退出,終止
void pthread_exit(void *retval);

注意:pthread_exit()返回的指針所指向的內存空間必須是全局的或者malloc分配的,不能在線程的棧上分配,因爲當其它線程得到這個返回的指針時,線程函數已經退出了


線程等待

當主線程等待子線程的結束,顯示的等待某線程的結束可以調用pthread_join()函數,其類似於進程的wait()函數。
這裏寫圖片描述

int pthread_join(pthread_t thread,viod **thread_return);

//thread:被等待的線程id
//thread_return:用戶自定義的指針,
//指向一個保存等待線程的完整退出狀態的靜態區域,它可以用來存儲被等待線程的返回值

此函數將調用該函數的線程掛起,直到所等待id爲thread的線程退出。

然而,被等待的(thread)線程會有不同的方法終止,通過pthread_join得到的終止狀態也是不同的:

  • 如果thread線程通過 return返回 ,value_ptr所指向的單元⾥裏存放的是thread線程函數的返回值。
  • 如果thread線程被別的線程調⽤ pthread_cancel異常終止 ,value_ptr所指向的單元⾥裏存放的是常數PTHREAD_CANCELED。
  • 如果thread線程是⾃己調⽤用 pthread_exit終⽌ 的,value_ptr所指向的單元存放的是傳給pthread_exit的參數。
  • 如果對thread線程的終止狀態不感興趣,可以傳NULL給 value_ptr 參數。

取消線程

1、發起取消操作

取消線程是指取消一個正在執行線程的操作。一個線程能夠被取消並終止執行需要滿足以下條件:

  • 線程是否可以被其它取消,默認可以被取消
  • 線程處於可取消的點才能被取消。也就是說。即使該線程被設置爲可取消,另一個線程發起取消操作,該線程也不是一定馬上終止,只有在可取消點才能終止執行

函數pthread_cancel()用來向某線程發送取消操作

int pthread_cancel(pthread_t thread);

//thread:線程id
返回:成功返回0,失敗返回錯誤碼

只有當目標線程的可取消狀態爲PTHREAD_CANCEL_ENABLE時,才能取消。

2、設置可取消狀態(可以/不可以)
int pthread_setcancelstate(int _state,int* _oldstate);

//state:要設置的新狀態
//oldstate:存儲原來的狀態

兩種狀態:

  • PTHREAD_CANCEL_DISABLE
  • PTHREAD_CANCEL_ENABLE
3、設置取消類型(立即/取消點)

pthread_sercanceltype()函數用來設置取消類型,即允許被取消的線程在接收到取消操作後是立即終止還是在取消點終止

int pthread_setcanceltype(int _type,int* _oldtype)

type的兩種類型:

  • PTHREAD_CANCEL_ASYNCHRONOUS,立即取消
  • PTHREAD_CANCEL_DEFERRED,到取消點取消

下面是一個取消線程的例子,主線程使用pthread_cancel函數來取消線程。

由於子線程調用pthread_setcancelstate函數設置了線程的取消狀態爲PYHREAD_CANCEL_DISABLE,所以此時的子線程不能被取消,主線程處於等待狀態。經過一段時間,子線程有調用pthread_setcancelstate函數,將子進程的取消狀態改爲PYHREAD_CANCEL_ENABLE,此時子線程可以被取消,從而使主線程能夠取消子線程。代碼如下:

這裏寫圖片描述

這裏寫圖片描述
這裏寫圖片描述

發佈了78 篇原創文章 · 獲贊 15 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章