1. 程式人生 > >多執行緒篇——初始Linux執行緒

多執行緒篇——初始Linux執行緒

執行緒模型

執行緒是程式完成一個獨立任務的完整執行序列,即一個可排程的實體。根據執行環境和排程者的身份,執行緒可分為核心執行緒和使用者執行緒。核心執行緒執行在核心空間上由核心排程,使用者執行緒執行在使用者空間上由執行緒庫來排程。一個程序可以有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:等待回收執行緒
#include <pthread.h>
int pthread_join(pthread_t thread, void **retval);
	thread:執行緒識別符號
	retval:執行緒退出傳遞的引數
	返回值:成功返回0,錯誤返回錯誤程式碼
			EDEADLK:可能引起死鎖,兩個執行緒相互呼叫pthread_join或者自身呼叫pthread_join
			EINVAL:目標執行緒是不可回收的或者已經被其他執行緒/程序回收了
			ESRCH:沒有該執行緒
pthread_cancel:異常關閉一個執行緒即取消一個執行緒
#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。