1. 程式人生 > >執行緒的一點小知識

執行緒的一點小知識

http://blog.csdn.net/pbymw8iwm/article/details/6721038這篇文章講的挺多,但是現在只用到很少的一部分,用到的部分就抄下來如下:

1.執行緒屬性

執行緒具有屬性,用pthread_attr_t表示,在對該結構進行處理之前必須進行初始化,在使用後需要對其去除初始化。我們用pthread_attr_init函式對其初始化,用pthread_attr_destroy對其去除初始化。

1

名稱:

pthread_attr_init/pthread_attr_destroy

功能:

對執行緒屬性初始化/去除初始化

標頭檔案:

#include<pthread.h>

函式原形:

int pthread_attr_init(pthread_attr_t*attr);

int pthread_attr_destroy(pthread_attr_t*attr);

引數:

Attr執行緒屬性變數

返回值:

若成功返回0,若失敗返回-1

呼叫pthread_attr_init之後,pthread_t結構所包含的內容就是作業系統實現支援的執行緒所有屬性的預設值。

如果要去除對pthread_attr_t結構的初始化,可以呼叫pthread_attr_destroy函式。如果pthread_attr_init實現時為屬性物件分配了動態記憶體空間,pthread_attr_destroy還會用無效的值初始化屬性物件,因此如果經

pthread_attr_destroy去除初始化之後的pthread_attr_t結構被pthread_create函式呼叫,將會導致其返回錯誤。

執行緒屬性結構如下:

typedef struct

{

int detachstate;執行緒的分離狀態

int schedpolicy;執行緒排程策略

structsched_paramschedparam;執行緒的排程引數

int inheritsched;執行緒的繼承性

intscope;執行緒的作用域

size_tguardsize;執行緒棧末尾的警戒緩衝區大小

intstackaddr_set;

void*stackaddr;執行緒棧的位置

size_tstacksize;

執行緒棧的大小

}pthread_attr_t;

每個個屬性都對應一些函式對其檢視或修改。下面我們分別介紹。

二、執行緒的分離狀態

執行緒的分離狀態決定一個執行緒以什麼樣的方式來終止自己。在預設情況下執行緒是非分離狀態的,這種情況下,原有的執行緒等待建立的執行緒結束。只有當pthread_join()函式返回時,建立的執行緒才算終止,才能釋放自己佔用的系統資源。

而分離執行緒不是這樣子的,它沒有被其他的執行緒所等待,自己執行結束了,執行緒也就終止了,馬上釋放系統資源。程式設計師應該根據自己的需要,選擇適當的分離狀態。所以如果我們在建立執行緒時就知道不需要了解執行緒的終止狀態,則可以pthread_attr_t結構中的detachstate執行緒屬性,讓執行緒以分離狀態啟動。

2

名稱:

pthread_attr_getdetachstate/pthread_attr_setdetachstate

功能:

獲取/修改執行緒的分離狀態屬性

標頭檔案:

#include<pthread.h>

函式原形:

int pthread_attr_getdetachstate(const pthread_attr_t *attr,int *detachstate);

int pthread_attr_setdetachstate(pthread_attr_t *attr,intdetachstate);

引數:

Attr執行緒屬性變數

Detachstate執行緒的分離狀態屬性

返回值:

若成功返回0,若失敗返回-1

可以使用pthread_attr_setdetachstate函式把執行緒屬性detachstate設定為下面的兩個合法值之一:設定為PTHREAD_CREATE_DETACHED,以分離狀態啟動執行緒;或者設定為PTHREAD_CREATE_JOINABLE,正常啟動執行緒。可以使用pthread_attr_getdetachstate函式獲取當前的datachstate執行緒屬性。

以分離狀態建立執行緒

#iinclude<pthread.h>

void *child_thread(void *arg)

{

printf(“child thread run!\n”);

}

int main(int argc,char *argv[ ])

{

pthread_ttid;

pthread_attr_tattr;

pthread_attr_init(&attr);

pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);

pthread_create(&tid,&attr,fn,arg);

pthread_attr_destroy(&attr);

sleep(1);

}

 

執行緒屬性


POSIX定義的執行緒屬性有:可分離狀態(detachstate), 執行緒棧大小(stacksize),執行緒棧地址( stackaddr),作用域(scope), 繼承排程(inheritsched), 排程策略(schedpolicy)和排程引數( schedparam)。 有些系統並不支援所有這些屬性,使用前注意檢視系統文件。但是所有Pthread系統都支援detachstate屬性,該屬性可以是PTHREAD_CREATE_JOINABLE或PTHREAD_CREATE_DETACHED,預設的是joinable的。擁有joinable屬性的執行緒可以被另外一個執行緒等待,同時還可以獲得執行緒的返回值,然後被回收。而detached的執行緒結束時,使用的資源立馬就會釋放,不用其他執行緒等待。執行緒stacksize屬性移植性不是很好,若你的系統定義了_POSIX_THREAD_ATTR_STACKSIZE ,才可以呼叫api設定執行緒堆疊大小。Pthreads規定執行緒堆疊大小必須大於等於PTHREAD_STACK_MIN。執行緒stackaddr屬性移植性相當不好,若系統定義了_POSIX_THREAD_ATTR_STACKADDR,才可以呼叫api設定執行緒堆疊地址,指定一塊記憶體區域,這塊記憶體區域大小至少是PTHREAD_STACK_MIN。機器堆疊向上增長的,必須指定為低地址;機器堆疊向下增長的,必須指定為高地址。這個屬性,最好不要用。

執行緒的相關API:

pthread_create():建立一個執行緒
pthread_exit():終止當前執行緒
pthread_cancel():中斷另外一個執行緒的執行
pthread_join():阻塞當前的執行緒,直到另外一個執行緒執行結束
pthread_attr_init():初始化執行緒的屬性
pthread_attr_setdetachstate():設定脫離狀態的屬性(決定這個執行緒在終止時是否可以被結合)
pthread_attr_getdetachstate():獲取脫離狀態的屬性
pthread_attr_destroy():刪除執行緒的屬性
pthread_kill():向執行緒傳送一個訊號

例如我這邊程式中用到的:

  pthread_attr_t attr;//對執行緒屬性初始化
  pthread_attr_init(&attr);//初始化執行緒
  pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);/<span style="font-family:宋體;">/執行緒以分離狀態啟動,自己執行結束,執行緒自行終止,馬上釋放系統資源</span><span style="font-size:16px"></span>
  pthread_create(&fota_thrd, &attr, start_fota_thread, NULL);//建立執行緒
  pthread_attr_destroy (&attr);//刪除執行緒屬性

使用多執行緒的理由之一是和程序相比,它是一種非常花銷小,切換快,更"節儉"的多工操作方式。在Linux系統下,啟動一個新的程序必須分配給它獨立的地址空間,建立眾多的資料表來維護它的程式碼段、堆疊段和資料段,這是一種"昂貴"的多工工作方式。而運行於一個程序中的多個執行緒,它們彼此之間使用相同的地址空間,共享大部分資料,啟動一個執行緒所花費的空間遠遠小於啟動一個程序所花費的空間,而且,執行緒間彼此切換所需的時間也遠遠小於程序間切換所需要的時間。
  使用多執行緒的理由之二是執行緒間方便的通訊機制。對不同程序來說,它們具有獨立的資料空間,要進行資料的傳遞只能通過通訊的方式進行,這種方式不僅費時,而且很不方便。執行緒則不然,由於同一程序下的執行緒之間共享資料空間,所以一個執行緒的資料可以直接為其它執行緒所用,這不僅快捷,而且方便。當然,資料的共享也帶來其他一些問題,有的變數不能同時被兩個執行緒所修改,有的子程式中宣告為static的資料更有可能給多執行緒程式帶來災難性的打擊,這些正是編寫多執行緒程式時最需要注意的地方。

執行緒與程序的對比可參考:http://www.cnblogs.com/gguozhenqian/archive/2011/11/16/2251521.html