《Linux執行緒雜說》

2021-07-23 10:45:55 字數 4880 閱讀 8162

在乙個程式中的多個執行線路就叫做執行緒(thread)。執行緒是乙個程序內部的乙個控制序列。之所以出現執行緒,是因為程序的建立開銷比較大,當fork乙個子程序時,記憶體映像要從父程序複製到子程序,所有的描述符要在子程序中複製乙份,同時fork子程序後需要程序間通訊(ipc),實現父子程序中通訊。

乙個程序中所有的執行緒共享乙個全域性記憶體空間。一下資訊是他們所共享的:

(1)程序指令

(2)開啟的檔案

(3)訊號處理程式和訊號處置

(4)當前工作目錄

(5)使用者id和組id

但是一下資訊卻是每個執行緒特定的:

(1)執行緒id

(2)棧

(3)errno

(4)優先順序

#include

int   pthread_create(pthread_t  *thread,pthread_attr_t   *attr, void  *(*start_routine)(void *),void *arg);

void *(*start_routine)(void *)

傳遞乙個函式位址,該函式傳遞乙個形參為void的指標,同時該函式的返回型別也是乙個void的指標。

#include

void  pthread_exit(void  *retval);

執行緒通過呼叫pthread_exit函式實現函式的呼叫退出,該函式的作用是終止呼叫他的執行緒並返回乙個指向某個物件的指標,注意,形參不能是區域性變數;

#include

void  pthread_join(pthread_t  th,void  **thread_return)

第一形參指定要等待結束的執行緒,第二個形參是乙個指標,它指向執行緒的返回值;

#include#include#include#include#includevoid *thread_function(void *arg);

char message="hello world";

int main()

printf("waiting for thread to finish.....\n");

res = pthread_join(mes_thread,&thread_result);

if(res != 0)

printf("after pthread_join ,it return %s\n",(char *)thread_result);

printf("message is :%s\n",message);

exit(0);

}void *thread_function(void *arg)

執行程式後其結果如下:

waiting for thread to finish.....

thread_function running,message is hello world

after pthread_join ,it return good bye thread_create

message is :good bye

**中pthread_create函式第二個形參設定為null,其指的的是執行緒的屬性,設定為null表示採用預設的屬性,

res = pthread_join(mes_thread,&thread_result);

第乙個形參表示正在等待的其結束的執行緒的標誌符,第二個形參是乙個指向執行緒返回值得指標;

函式pthread_attr_init函式,他的作用是初始化乙個執行緒屬性物件

#include

int  pthread_attr_init(pthread_attr_t  *attr);

初始化乙個執行緒屬性之後,我們可以通過許多函式的呼叫來設定不同的屬性,下面介紹一些常用的函式:

int  pthread_attr_setdetachstate(pthread_attr_t  *attr, int detachstate)

int pthread_attr_getdetachstate(pthread_attr_t  *attr , int *detachstate)

int pthread_attr_setschedpolicy(pthread_attr_t  *attr , int policy)

int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy)

(1)detachstate :這個屬性允許我們無需對執行緒從新合併。pthread_attr_setdetachstate函式可能用到兩個標誌分別為pthread_create_joinable和pthread_create_detached如果標誌設定為pthread_create_detached,就不能呼叫pthread_join來獲得另乙個執行緒的返回狀態了。

(2)schedpolicy這個屬性控制線程的排程方式,他的取值可以是sched_other、sched_rp、sched_fifo預設為other,

#include#include#include#include#includevoid *thread_function(void *arg);

char message="hello world";

int thread_finished = 0;

int main()

res = pthread_attr_setdetachstate(&thread_attr,pthread_create_detached);

if(res != 0)

res = pthread_create(&mes_thread,&thread_attr,thread_function,(void *)message);

if(res != 0)

pthread_attr_destroy(&thread_attr);

while(!thread_finished)

printf("finish\n");

exit(0);

}void *thread_function(void *arg)

**編譯執行後結果為:

thread_function running,message is hello world

waiting for thread to say it's finish..

waiting for thread to say it's finish..

waiting for thread to say it's finish..

finish

(1)首先,定義一些額外變數

int  max_priority;

int min_priority;

struct sched_param scheduling_value;

(2)設定好脫離屬性

res = pthread_attr_setschedpolicy(&thread_attr,sched_other);

if(res != 0)

(3)查詢允許的優先順序範圍

max_priority = sched_get_priority_max(sched_other);

min_priority = sched_get_priority_min(sched_other);

(4)設定優先順序

scheduling_value.sched_priority = min_priority;

res = pthread_attr_setschedparam(&thread_attr,&scheduling_value);

#include

int pthread_cancel(pthread_t thread);         

形參為乙個執行緒的標誌符,通過提供乙個執行緒的識別符號,我們就可以傳送請求來取消它,在接受端,通過呼叫pthread_setcancelstate設定自己的取消狀態;

int  pthread_setcancelstate(int  state, int *oldstate)

第乙個形參取值可以是pthread_cancel_enable,這個允許執行緒取消,也可以是pthread_cancel_disable忽略取消執行緒,oldstate獲取先前取消狀態。

int   pthread_setcanceltype(int type, int  *oldtype);

type可以有兩種取值,乙個是pthread_cancel_asynchronous,它使得接收到取消請求後立即取消,另乙個是pthread_cancel_deferred它使得接收到取消請求後,一直等待執行緒執行下述操作後取消:pthread_join;pthread_cond_wait;sem_wait等;

#include#include#include#includevoid *thread_function(void *arg);

int main()

void *thread_function(void *arg)

pthread_exit(0);

}

程式執行結果為:

thread_function is running

thread is still running (0).....

thread is still running (1).....

thread is still running (2).....

canceling thread.......

waiting for thread to finish

多執行緒程式設計雜說2

多執行緒程式設計普及出現在90年以後,之前只有多核的cpu伺服器才有這樣的需要。多執行緒以其複雜化脆弱性著稱,程式設計師大多避而不談或只是簡單的應用。執行緒保護的互斥鎖被認為是導致延遲和效能下降的主因。這主要有兩方面的原因,第一大部分應用只需要乙個執行緒進行處理有著強烈的排他性和連貫性,第二很少有使...

Python己亥雜說3(續)

1 list tuple dict set 是可迭代物件,字串是不是可迭代物件 是 from collections import iterable print isinstance abc iterable true print isinstance iterable true2 集合的定義,建立...

linux 執行緒 執行緒屬性

typedef struct pthread attr t 這個結構只是為了說明 實際結構具體系統而定 雖然如此我們並不用擔心因為 屬性值不能直接設定,須使用相關函式進行操作 int pthread attr init pthread attr t attr 初始化執行緒屬性 int pthread...