一.概述
linux中不區分進程和線程,都認為是個任務,都是創建一個task_struct.如何區分?線程是共享相同地址空間,而進程是獨占地址空間.
多線程共享同一進程的地址空間
優點:
通信方便,可以通過全局變量.
缺點:
訪問共享數據時需要考慮同步和互斥.
二.線程共享資源:
可執行的指令
靜態數據
進程中打開的文件描述符
當前工作目錄
用戶ID
用戶組ID
三.線程私有資源:
線程ID
PC(程序計數器)和相關寄存器:保證不同線程執行不同的代碼.
堆棧
錯誤號
優先級
執行狀態和屬性
四.Linux線程庫:
pthread線程庫:(POSIX)
1.創建線程:
2.回收線程(pthread_join):
pthread_join(pthread_t thread, void **retval)
*retval接收線程thread函數對應的返回值,比如return返回的值或者pthread_exit中的retval.(兩者是等效的)
3.結束線程(pthread_exit):
結束當前線程,而exit是結束當前的進程.
pthread_exit(void *retval)相當於return retval;可以是各種類型.
retval可被其他線程通過pthread_join獲取.
示例:
#include<stdio.h> #include<unistd.h> #include<pthread.h> void * task(void * param) { sleep(5); printf("hello\n"); //pthread_exit(NULL); //pthread_exit("子線程執行完畢"); //既可以返回NULL,也可以返回字符串. return "子線程執行完畢"; } int main() { //初始化線程 pthread_t tid; void *result; //創建線程 int rc = pthread_create(&tid, NULL, task, NULL); if(rc) { printf("線程創建失敗!\n"); return -1; } pthread_join(tid, &result); printf("創建主線程\n"); printf("result is %s\n", result); pthread_exit(NULL); //退出,並返回NULL,有個就不需要return 0了. }