執行緒控制之一

2021-04-27 13:44:41 字數 3495 閱讀 8822

1. 執行緒限制

與其它的系統限制一樣,這些執行緒限制也是通過sysconf函式進行查詢的。當某些作業系統實現沒有定義相應的sysconf符號(_sc_)時,表示為"未定義符號";如果作業系統實現的限制是不確定的,表示為"沒有確定的限制",但這並不意味是無限制的;"不支援"表明作業系統實現定義了相應的sysconf限制符號,但是sysconf函式無法識別這個符號。

2. 執行緒屬性

在呼叫pthread_create時,可以使用pthread_attr_init函式初始化pthread_attr_t 結構,就是支援作業系統所支援的執行緒所有預設屬性。如果需要修改其中個別屬性值,需要呼叫其它的函式。如果要去除pthread_attr_t結構的初始化,可以呼叫pthread_attr_destroy函式。如果pthread_attr_init實現時為屬性物件分配了空間,pthread_attr_destroy將會釋放該記憶體空間。pthread_attr_t結構對應用程式是不透明的,增強了程式可移植性。

int pthread_attr_init (pthread_attr_t *attr);

pthread_t phread_attr_destroy(pthread_attr_t *attr);

2.1. 分離執行緒

int pthread_attr_getdetachstate(const pthread_attr_t *restrict attr,

int *detachstate);

int pthread_attr_setdetachstate(pthread_attr_t *attr, int *detachstate);

2.2. 執行緒棧屬性(stacksize)

對於遵循xsi的系統,支援執行緒棧屬性就是必須的。可以通過在執行階段把_sc_thread_attr_stackaddr和_sc_thread_attr_stacksize引數傳給sysconf函式,檢查系統執行緒棧屬性的支援情況。執行緒棧屬性的查詢和修改一般是通過較新的函式pthread_attr_getstack和pthread_attr_setstack來進行。

int pthread_attr_getstack (const pthread_attr_t *restrict attr,

void **restrict stackaddr,

size_t *restrict stacksize);

int pthread_attr_setstack (const thread_attr_t *attr,

void *stackaddr,size_t stacksize);

對於程序來說,虛擬位址空間的大小是固定的,程序中只有乙個棧,所以它的大小通常不是問題。但是對於執行緒來說,同樣大小的虛擬位址空間必須被所有的執行緒共享。如果應用程式使用太多的執行緒,至使執行緒棧的累計大小超過了可用的虛擬位址空間,這時就需要減少執行緒預設的棧大小;如果執行緒呼叫的函式分配了大量的自動變數或者呼叫的函式涉及很深的棧幀,則這時需要的棧大小可能比預設的大。

如果用完了執行緒棧的虛擬位址空間,可以使用malloc和mmap來為其他的執行緒分配空間,並用pthread_attr_getstack函式來改變新建立執行緒的棧位置。執行緒棧所佔記憶體範圍中可定址的最低位址可以由stackaddr引數指定,該位址與處理器結構相應的邊界對齊。

應用程式也可以設定或讀取執行緒屬性stacksize。

int pthread_attr_getstacksize (const pthread_attr_t *restrict attr,

size_t *restrict stacksize);

int pthread_attr_setstacksize (thread_attr_t *attr, size_t stacksize);

2.3. 執行緒屬性(guardsize)

執行緒屬性guardsize控制著執行緒棧末尾之後用以避免棧溢位的擴充套件記憶體的大小。這個屬性預設為pagesize個位元組。如果把guardsize設定為0,作業系統就不會提供警戒緩衝區。

int pthread_attr_getguardsize (const pthread_attr_t *restrict attr,

size_t *restrict guardsize);

int pthread_attr_setguardsize (thread_attr_t *attr, size_t guardsize);

如果guardsize執行緒屬性被修改了,作業系統可能把它取為頁大小的整數倍。如果執行緒的棧指標溢位到警戒區域,應用程式就可能通過訊號收到出錯資訊。

2.4. 併發度

併發度控制著使用者級執行緒可以對映的核心執行緒或程序的數目。

int pthread_getconcurrency (void);

int pthread_setconcurrency (int level);

如果作業系統之前沒有設定過併發度,函式pthread_getconcurrency將返回0。函式pthread_setconcurrency設定的併發度只是對系統的乙個提示,系統並不保障請求的併發度一定被採用。

2.5. 可取消狀態

有兩個執行緒屬性並沒有包括在pthread_attr_t結構中,它們是可取消狀態和可取消型別。這兩個屬性影響著執行緒在響應pthread_cancel函式呼叫時所呈現的行為。

可取消狀態可以是pthread_cancel_enable,也可以是pthread_cancel_disable。執行緒可以通過呼叫pthread_setcancelstate修改它的可取消狀態。

int pthread_setcancelstate(int state, int *oldstate);

函式pthread_cancel呼叫並不等待執行緒終止,在預設情況下,執行緒在取消請求發出以後還是繼續執行,直到執行緒到達某個取消點。取消點是執行緒檢查是否被取消並按照請求進行動作的乙個位置。執行緒啟動時預設的可取消狀態是pthread_cancel_enable。當狀態設定為pthread_cancel_disable,對pthread_cancel的呼叫並不會殺死執行緒;相反,取消請求對這個執行緒處於未決狀態。當取消狀態再次變為pthread_cancel_enable時,執行緒將在下乙個取消點上對所有的取消請求進行處理。

如果應用程式在很長一段時間內都不會呼叫到有取消點的函式,那麼可以呼叫pthread_testcancel函式在程式中自己新增取消點。

int pthread_testcancel(void);

呼叫pthread_testcancel時,如果在某個取消請求處於未決狀態,而且取消並沒有置為無效,那麼執行緒就會被取消。但是如果取消被置為無效時,pthread_testcancel呼叫就沒有任何效果。

2.6. 可取消型別

int pthread_setcanceltype(int type, int *oldtype);

type引數可以是pthread_cancel_deferred,也可以是pthread_cancel_asyschronous。非同步取消與延遲不同,使用非同步取消時,執行緒可以再任意時間取消,而不是非得遇到取消點才能被取消。

執行緒控制 join執行緒

在我們做專案的時候時常會有這樣的一種需求 我們需要執行兩個方法,乙個方法要等另乙個方法執行完才能執行,這樣的狀況放到多執行緒中要怎麼實現呢?今天就來看看多執行緒中的join方法。我們的均方法通常是把乙個大問題分成許多小問題,每個小問題分配乙個執行緒,當所有的小問題都得到處理後,在呼叫主線程來進一步操...

執行緒 之 執行緒控制

下面有幾種方法可以很好的控制線程的執行。1.join 執行緒控制 2.後台執行緒 守護執行緒 3.sleep執行緒睡眠 4.yield執行緒讓步 1.join 執行緒控制。thread提供了讓乙個執行緒等待另外乙個執行緒完成的方法 join 方法 意思 當在a程式執行流 執行緒 中呼叫b執行緒的ji...

執行緒控制函式

執行緒共享資源如下 靜態資料 程序中開啟的檔案描述符 當前工作目錄 使用者i d int pthread create pthread t thread,pthread attr t attr,void start routine void void arg 函式作用建立乙個執行緒 thread 執...