1. 程式人生 > >Linux 學習筆記—執行緒間通訊的概念和執行緒控制函式

Linux 學習筆記—執行緒間通訊的概念和執行緒控制函式

1 執行緒間通訊 執行緒間無需特別的手段進行通訊,由於執行緒間能夠共享資料結構,也就是一個全域性變數能夠被兩個執行緒同一時候使用。只是要注意的是執行緒間須要做好同步,一般用mutex。執行緒間的通訊目的主要是用於執行緒同步,所以執行緒沒有像程序通訊中的用於資料交換的通訊機制。 執行緒的基本概念 執行緒的定義: 執行緒也被稱為輕量程序(LWP)計算機科學術語,指執行中的程式的排程單位。執行緒是程序中的實體,一個程序可以擁有多個執行緒,一個執行緒必須有一個父程序。執行緒不擁有系統資源,只有執行必須的一些資料結構;它與父程序的其它執行緒共享該程序所擁有的全部資源。執行緒可以建立和撤消執行緒,從而實現程式的併發執行。一般,執行緒具有就緒、阻塞和執行三種基本狀態。 在多中央處理器的系統裡,不同執行緒可以同時在不同的中央處理器上執行,甚至當它們屬於同一個程序時也是如此。大多數支援多處理器的作業系統都提供程式設計介面來讓程序可以控制自己的執行緒與各處理器之間的關聯度。

多執行緒的概念:執行緒是程式中完成一個獨立任務的完整執行序列,即一個可排程的實體;程序相當於執行中程式的一種抽象。根據執行環境的排程者的身份,執行緒可分為核心執行緒和使用者執行緒。核心執行緒,在有的系統上稱為LWP(Light Weight Process,輕量級執行緒),執行在核心空間,由核心排程;使用者執行緒執行在使用者空間,由執行緒庫來排程。當程序的一個核心執行緒獲得CPU的使用權時,它就載入並執行一個使用者執行緒。可見,核心執行緒相當於使用者執行緒執行的‘容器’,一個程序可以擁有M個核心執行緒和N個使用者執行緒,其中M<=N,並且一個系統的所有程序中,M和N的比值是固定的。

2 執行緒控制函式

(1) pthread_create #include <pthread.h> int pthread_create(pthread_t * tidp, const pthread_attr_t *attr, void *(*start_rtn)(void *), void *arg); // 返回:成功返回0,出錯返回錯誤編號

pthread_create (thread, attr, start_routine, arg) 在這裡,pthread_create 建立一個新的執行緒,並讓它可執行。下面是關於引數的說明: 引數說明 引數 說明 thread 指向執行緒識別符號指標。 attr 一個不透明的屬性物件,可以被用來設定執行緒屬性。您可以指定執行緒屬性物件,也可以使用預設值 NULL。 start_routine 執行緒執行函式起始地址,一旦執行緒被建立就會執行。 arg 執行函式的引數。它必須通過把引用作為指標強制轉換為 void 型別進行傳遞。如果沒有傳遞引數,則使用 NULL。 建立執行緒成功時,函式返回 0,若返回值不為 0 則說明建立執行緒失敗。 呼叫舉例:

  1. pthread_t tid1;
  2. // 執行緒執行函式起始地址,一旦執行緒被建立就會執行。
  3. void * thread_fun(void * arg);
  4. int err;
  5. err=pthread_create(&tid1,NULL,thread_fun,NULL); //方式1
  6. pthread_create(&tid1,NULL,thread_fun, (void *)0);//方式2

(2) pthread_exit #include <pthread.h> void pthread_exit(void *rval_ptr); // 執行緒終止   執行緒在結束時最好呼叫該函式,以確保安全、乾淨的退出。pthread_exit函式通過rval_ptr引數向呼叫執行緒的回收者傳遞退出資訊,程序中的其他執行緒可以呼叫pthread_join函式訪問到這個指標。pthread_exit執行完後不會返回到呼叫者,而且永遠不會失敗。 執行緒可以通過以下三種方式退出,在不終止整個程序的情況下停止它的控制流: • 執行緒只是從啟動過程中退出,返回值是執行緒的退出碼 • 執行緒可以被同一程序中的其他執行緒取消 • 執行緒呼叫pthread_exit 呼叫舉例:pthread_exit((void *)2); (3) pthread_join #include <pthread.h> int pthread_join(pthread_t thread, void **rval_ptr); // 返回:成功返回0,出錯返回錯誤程式碼   thread是目標執行緒識別符號,rval_ptr指向目標執行緒返回時的退出資訊,該函式會一直阻塞,直到被回收的執行緒結束為止。可能的錯誤碼為:

呼叫舉例:pthread_join(tid1, NULL);

(4) pthread_cancel #include <pthread.h> int pthread_cancel(pthread_t thread); // 返回:成功返回0,出錯返回錯誤程式碼   預設情況下,pthread_cancel函式會使有thread標識的執行緒的表現為如同呼叫了引數為PTHREAD_CANCEL的pthread_exit函式,但是,接收到取消請求的目標執行緒可以決定是否允許被取消以及如何取消,這分別由以下兩個函式來控制: #include <pthread.h> int pthread_setcancelstate(int state, int *oldstate); int pthread_setcanceltype(int type, int *oldstate); 注意pthread_cancel並不等待執行緒結束,它只是提出請求。