?線程概念
一個進程需要訪的大部分資源,諸如自身的代碼、數據、new\malloc的空間數據、命令行參數和環境變量、動態庫、甚至是系統調用訪問內核代碼…都是通過虛擬地址空間來訪問的。換而言之,進程地址空間是進程的資源窗口!!
?? ?進程創建費時費力。在創建時,我們需要為進程創建PCB、地址空間、頁表、將進程自身的代碼和數據換入內存并建立映射、將進程PCB狀態改為R狀態、添加帶運行隊列中…??但如果現在已經存在一個線程了,我僅僅將進程PCB復制多份,然后讓所有“進程”PCB全部指向同一個虛擬地址空間。然后通過技術手段,將虛擬地址空間合理分配給每一個“進程”。當CPU調度執行該“”進程“時,只會執行原本進程中的一部分代碼和數據,執行我們要執行任務的一部分任務,我們將這種比傳統“進程”更加輕量化的進程就稱為線程!!
線程的創建

?
#include <stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
void * myfunc(void *arg)
{printf("child pthread id : %ld\n",pthread_self());
}
int main()
{pthread_t pthid;int ret;ret=pthread_create(&pthid,NULL,myfunc,NULL);if(ret!=0){printf("error number is %d\n",ret);printf("%s\n",strerror(ret));}printf("parent pthread id : %ld\n",pthread_self());for(int i=0;i<5;i++){printf("i=%d\n",i);}sleep(2);return 0;
}
使用sleep()函數先防止主函數1進程結束,導致子進程消失
單個線程退出 --pthread_exit
#include <stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
void * myfunc(void *arg)
{printf("child pthread id : %ld\n",pthread_self());exit(0);
}
int main()
{pthread_t pthid;int ret;int i=0;ret=pthread_create(&pthid,NULL,myfunc,NULL);if(ret!=0){printf("error number is %d\n",ret);printf("%s\n",strerror(ret));}printf("parent pthread id : %ld\n",pthread_self());while(i<10){printf("i=%d\n",i);i++;}pthread_exit(NULL);sleep(2);return 0;
}
?
阻塞等待線程退出,獲取線程退出狀態--pthread_join

#include <stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
int num=100;
void * myfunc(void *arg)
{printf("child pthread id : %ld\n",pthread_self());
// exit(0);for(int i=0;i<5;i++){printf("child pthread %d\n",i);}pthread_exit(&num);
}
int main()
{pthread_t pthid;int ret;int i=0;ret=pthread_create(&pthid,NULL,myfunc,NULL);if(ret!=0){printf("error number is %d\n",ret);printf("%s\n",strerror(ret));}printf("parent pthread id : %ld\n",pthread_self());void*ptr=NULL;pthread_join(pthid,&ptr);printf("num=%d\n",*(int*)ptr);while(i<10){printf("i=%d\n",i);i++;}sleep(2);return 0;
}
?
?線程分離--pthread_detach
殺死(取消)線程--pthread_cancel
比較兩個線程ID是否相等(預留函數) --pthread_equal?
線程的分離屬性
1.分離屬性是屬于線程的屬性,有了分離屬性的線程,是不需要別的線程去接合自己的(回收自己的資源)。
但是雖然是分離的,但是如果進程退出,該線程還是會退出的。
2.分離屬性的特點
該線程的資源,不需要被別的線程回收(接合),資源是由系統來回收的。
分離屬性 ? ?--> ?不需要被的線程去調用pthread_join()來回收資源。
非分離屬性 ?--> ?需要被別的線程去調用pthread_join來回收資源。
#include <stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
void * myfunc(void *arg)
{printf("child pthread id : %ld\n",pthread_self());
}
int main()
{pthread_t pthid;int ret;pthread_attr_t arr;pthread_attr_init(&arr);pthread_attr_setdetachstate(&arr,PTHREAD_CREATE_DETACHED);ret=pthread_create(&pthid,&arr,myfunc,NULL);if(ret!=0){printf("error number is %d\n",ret);printf("%s\n",strerror(ret));}printf("parent pthread id : %ld\n",pthread_self());for(int i=0;i<5;i++){printf("i=%d\n",i);}sleep(2);pthread_attr_destroy(&arr);return 0;
}