1. 程式人生 > >執行緒控制(一)

執行緒控制(一)

執行緒介紹

執行緒是計算機中獨立執行的最小單位,執行時佔用很少的系統資源.被看成是作業系統分配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:堆疊的大小