APUE Chapter 執行緒控制

2021-07-25 04:34:44 字數 3046 閱讀 5463

執行緒限制,可通過sysconf函式查詢。

/* 若成功則返回0,否則返回錯誤編號 */

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

/* 若成功則返回0,否則返回錯誤編號 */

detachstate:

–> pthread_create_detached,以分離狀態啟動執行緒。

–> pthread_create_joinable,正常啟動執行緒,應用程序可以獲取執行緒的終止狀態。

可以在編譯階段使用 _posix_thread_attr_stackaddr 和_posix_thread_attr_stacksize 符號來檢查系統是否支援執行緒棧屬性。

也可以在執行階段把 _sc_thread_attr_stackaddr 和_scthread_attr_stacksize 引數傳給sysconf函式,檢查系統對執行緒棧屬性的支援情況。

查詢和修改執行緒棧屬性:

#include 

int pthread_attr_getstack(const pthread_attr_t *restrict attr, void **restrict stackattr, size_t *restrict stacksize);

int pthread_attr_setstack(pthread_attr_t *attr, void *stackattr, size_t *stacksize);

/* 若成功則返回0,否則返回錯誤編號 */

對程序來說,虛擬位址空間的大小是固定的,程序中只有乙個棧。

但對執行緒來說,同樣大小的虛擬位址空間必須被所有的執行緒棧共享。

如果用完了執行緒棧的虛擬位址空間,可以使用malloc或者mmap來為其他棧分配空間,並用pthread_attr_setstack函式來改變新建執行緒的棧位置。

執行緒棧所佔記憶體範圍中可定址的最低位址可以由stackaddr引數指定,該位址與處理器結構相應的邊界對齊。

stackaddr執行緒屬性被定義為棧的記憶體單元的最低位址,但這並不必然是棧的開始位置。

#include 

int pthread_attr_getstacksize(const pthread_attr_t *restrict attr, size_t *restrict stacksize);

int pthread_attr_setstacksize(pthread_attr_t *attr, size_t *stacksize);

/* 若成功則返回0,否則返回錯誤編號 */

通過上面兩個函式設定執行緒屬性stacksize

(用途:如果希望改變棧的預設大小,但又不想自己處理執行緒棧的分配問題。)

執行緒屬性guardsize—— 控制著執行緒末尾之後用以避免棧溢位的擴充套件記憶體的大小。這個屬性預設為 pagesize 個位元組。

#include 

int pthread_attr_getguardsize(const pthread_attr_t *restrict attr, size_t *restrict guardsize);

int pthread_attr_setguardsize(pthread_attr_t *attr, size_t *guardsize);

/* 若成功則返回0,否則返回錯誤編號 */

把guardsize設定為0,在這種情況下不會提供警戒緩衝區。

同樣,對stackattr作了修改,系統就會假設我們會自己管理棧,並使警戒緩衝區機制無效,等同於把guardsize執行緒屬性設定為0。

如果guardsize執行緒屬性被修改了,作業系統可能把它取為頁大小的整數倍。

如果執行緒的棧指標溢位到警戒區域,應用程式就可能通過訊號接收到出錯資訊。

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

如果核心級執行緒和使用者級的執行緒之間保持一對一的對映,那麼改變併發度並不會有什麼效果。

如果使用者級執行緒到核心級執行緒或程序之間保持多對一的對映,那麼給定時間內增加使用者級執行緒數,可能會改善效能。

#include 

int pthread_getconcurrency(void);

/* 返回:當前的併發度 */

int pthread_setconcurrency(int level);

/* 返回:若成功則返回0,否則返回錯誤編號 */

注意:pthread_getconcurrency返回當前的併發度。

如果系統當前正控制著併發度(即之前沒有呼叫過pthread_setconcurrency函式),那麼pthread_getconcurrency返回0。

pthread_setconcurrency函式設定的併發度只是對系統的乙個提示,系統並不保證請求的併發度一定會被採用。

如果希望系統自己決定併發度,設定level為0。

執行緒控制 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 執...