執行緒控制(一)
執行緒介紹
*執行緒是計算機中獨立執行的最小單位,執行時佔用很少的系統資源.被看成是作業系統分配CPU時間的基本單位.
*在使用者看來:各個執行緒同時執行.
在作業系統排程上看:各個執行緒交替進行,系統不停在各個執行緒之間切換,每個執行緒只有在系統分配給它的時間片內才能取得CPU的控制權,執行執行緒中的程式碼.
*在多CPU多核的主機上,多個執行緒是可以同時執行的.
*多執行緒相對多程序的優點:
>1.建立一個新的執行緒花費時間少
2.執行緒間的切換速度遠快於程序間的切換速度
3.通訊快,可以直接提供給其他執行緒使用,不必經過作業系統
4.可以提高應用程式的響應速度
5.可以提高多處理器效率
6.可以改善程式的結構
*節約資源,節約時間
*執行緒的私有資料:
執行緒號,暫存器(包括程式計數器和堆疊指標),堆疊,訊號掩碼,優先順序,執行緒私有的儲存空間
*執行緒號又稱訊號遮蔽字,規定了當前要遮蔽或要阻塞遞送到該程序的訊號集.
*編寫linux下的多執行緒應用程式,需要使用標頭檔案pthread.h,連結時需要使用庫libpthread.a
*連線執行緒庫:gcc -lpthread
建立執行緒
一.執行緒建立函式 Pthread_create
如果在主執行緒裡面建立執行緒,程式就會在建立執行緒的地方產生分支,變成兩個程式執行.和多程序不同的是,子程序是通過拷貝父程序的地址空間來執行的,而執行緒與程序內的執行緒共享程式程式碼,一段程式碼可以同時被多個執行緒執行.
執行緒的建立通過函式pthread_create來完成,該函式宣告如下:
**#include<pthread.h>
int pthread_create(pthread_t *thread, pthread_attr_t * attr, void *(*start_routine)(void *), void *arg);**
>函式各引數含義:
>thread:該引數是一個指標,當執行緒建立成功時,用來返回建立的執行緒ID.
>attr:該引數用於指定執行緒的屬性,NULL表示使用預設屬性.
>start:該引數為一個函式指標,指向執行緒建立後要呼叫的函式,即執行緒函式.
>arg:該引數指向傳遞給執行緒函式的引數
*執行緒建立成功後,pthread_create函式返回0,若不為0,說明建立執行緒失敗.
*常見的錯誤碼:
>1.EAGAIN:表示系統限制建立新的執行緒,例,執行緒數目過多
>2.EINVAL:表示第2個引數代表的執行緒屬性非法
*執行緒建立成功後,新建立的執行緒開始執行第3個引數所指向的函式,原來的執行緒繼續執行.
>createthread.c函式
#include<stdio.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
int *thread(void *arq)
{
pthread_t newthid;
newthid = pthread_self();
printf("this is a new thread,thread ID = %lu\n",newthid);
return NULL;
}
int main(void)
{
pthread_t thid;
printf("main thread ,ID is %lu\n",pthread_self()); //列印主執行緒的ID
if(pthread_create(&thid,NULL,(void *)thread,NULL) != 0) {
printf("thread creation failed\n");
exit(1);
}
sleep(1);
exit(0);
}
執行緒屬性
*執行緒建立函式pthread_create有一個引數的型別為pthread_attr_t,該結構體的定義如下:
typedef struct {
int detachstate;
int schedpolicy;
struct sched_param schedparam;
int inheritsched;
int scope;
size_t guardsize;
int stackaddr_set;
void * stackaddr;
size_t stacksize;
} pthread_attr_t;
*各個欄位含義:
>detachstate:表示新建立的執行緒是否與程序中其他的執行緒脫離同步
>schedpolicy:表示新執行緒的排程策略
> schedparam:一個struct sched param 結構,其中有一個sched_priority整型變量表示執行緒的執行優先順序
>inheritsched:有兩種值可以選擇
>scope:表示執行緒間競爭CPU的範圍
>guardsize:警戒堆疊的大小
> stackaddr_set:堆疊地址集
>stackaddr:堆疊的地址
>stacksize:堆疊的大小