1.線程的實現方式
1.用戶級線程
開銷小,用戶空間就可以創建多個。缺點是:內核無法感知用戶級多個線程的存在,把其當作只有一個線程,所以只會提供一個處理器。
2.內核級線程
相對于用戶級開銷稍微大一點,可以利用多個處理器。
3.組合級線程
在不同平臺Linux 中線程的實現:
Linux 實現線程的機制非常獨特。從內核的角度來說,它并沒有線程這個概念。Linux 把所有的線程都當做進程來實現。內核并沒有準備特別的調度算法或是定義特別的數據結構來表征線程。相反,線程僅僅被視為一個與其他進程共享某些資源的進程。每個線程都擁有唯一隸屬于自己的 task_struct,所以在內核中,它看起來就像是一個普通的進程(只是線程和其他一些進程共享某些資源,如地址空間)。
2.線程的使用
2.1線程庫的接口—pthread函數
1)pthread_create
#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
pthread_create()創建一個新的線程,類似于創建新進程的fork函數
參數一:pthread_t *thread:指向一個pthread_t類型數據的指針,線程被創建時,這個指針指向的變量中會被寫入一個標識符,我們用該標識符引用新線程;
thread:接收創建的新線程的ID,根據不同的ID名,對相應的線程做管理
參數二:const pthread_attr_t *attr
attr: 指定線程的屬性,一般不設置特殊屬性,設置該參數為NULL;
參數三:void *(*start_routine) (void *):參數為void類型指針,返回值也為指向void的指針的函數地址。告知新線程從這個函數指針指向的位置開始執行。
start_routine: 線程將要啟動的指定線程函數
參數四:void *arg:給線程函數傳遞的參數指針
arg: 給線程函數傳遞的參數//成功返回 0, 失敗返回錯誤代碼
2)pthread_join
int pthread_join(pthread_t thread, void **retval);
pthread_join()等待 thread 指定的線程退出,線程未退出時,該方法阻塞。等價于進程中用于收集子進程退出信息的wait函數。
參數一:pthread_t thread:指定將要等待的線程(此處用pthread_t變量名),
參數二:void **retval:是一個指針,它指向另一個指針,后者指向線程的退出信息。//成功返回 0, 失敗返回錯誤代碼
3)pthread_exit
int pthread_exit(void *retval);
pthread_exit()線程通過調用此函數終止執行。等價于進程結束時調用exit函數退出
參數:void *retval:指向線程退出信息的指針或者說是線程退出時返回指向某個對象的指針,該對象不能是局部對象,因為此函數結束后,該局部變量就不存在了,會引起程序泄漏。