多執行緒篇——初始Linux執行緒
阿新 • • 發佈:2018-12-10
執行緒模型
執行緒是程式完成一個獨立任務的完整執行序列,即一個可排程的實體。根據執行環境和排程者的身份,執行緒可分為核心執行緒和使用者執行緒。核心執行緒執行在核心空間上由核心排程,使用者執行緒執行在使用者空間上由執行緒庫來排程。一個程序可以有M個核心執行緒、N個使用者執行緒(M<=N)。並且在一個系統中所有程序M:N一定,按這個比值執行緒實現方式可分為三種模式:完全在使用者空間實現、完全由核心排程和雙層排程。相對於前兩種雙層排程模型結合了前兩種的優點:不但不消耗記憶體並且切換速度快、CPU利用率高。執行緒相關函式和資料結構
typedef unsigned long int pthread_t;//執行緒的識別符號1.pthread_create:執行緒建立函式
#include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *),void *arg); thread: 執行緒識別符號 attr:執行緒屬性設定,NULL表示預設屬性 start_routine:執行緒執行函式引數和返回值都為空 arg:傳遞給執行函式的引數 返回值:成功0,失敗返回錯誤編號
2.pthread_exit:執行緒一旦建立好,就由核心排程執行函式。執行緒在結束時最好呼叫執行緒退出函式,以確保安全穩定的退出。
#include <pthread.h>
void pthread_exit(void *retval);
retval:退出所傳入得引數
pthread_exit:retval向執行緒排程者傳輸退出資訊。3.pthread_join:等待回收執行緒
pthread_cancel:異常關閉一個執行緒即取消一個執行緒#include <pthread.h> int pthread_join(pthread_t thread, void **retval); thread:執行緒識別符號 retval:執行緒退出傳遞的引數 返回值:成功返回0,錯誤返回錯誤程式碼 EDEADLK:可能引起死鎖,兩個執行緒相互呼叫pthread_join或者自身呼叫pthread_join EINVAL:目標執行緒是不可回收的或者已經被其他執行緒/程序回收了 ESRCH:沒有該執行緒
#include <pthread.h>
int pthread_cancel(pthread_t thread);
thread:執行緒識別符號
不過接受到取消請求的目標執行緒可以決定是否取消以及如何取消,這分別由這兩個函式完成。 #include <pthread.h> int pthread_setcancelstate(int state, int *oldstate); int pthread_setcanceltype(int type, int *oldtype); 這兩個函式的第一個引數分別用於設定執行緒的取消狀態(是否取消)和取消型別(如何取消), 第二個引數分別記錄執行緒原來的狀態和取消型別。 state可以有兩個選值: PTHREAD_CANCEL_ENABLE:允許執行緒被建立時的預設取消狀態。 PTHREAD_CANCEL_DISABLE:禁止執行緒被取消。這種情況下 如果一個執行緒收到取消請求則他會被掛起知道執行緒允許取消。 type可選值: PTHREAD_CANCEL_ASYNCHRONOUS:執行緒隨時都可以被取消。 PTHREAD_CANCEL_DEFERRED:允許目標執行緒推遲行動, 直到呼叫下面個所謂的取消函式中的一個 pthread_join,pthread_testcancel,pthread_cond_wait,pthread_cond_timedwait, sem_wait和sigwait。