1. 程式人生 > >第12章 執行緒控制

第12章 執行緒控制

請移步到這:

12.2 執行緒限制

12.3 執行緒屬性

執行緒具有一系列屬性,這些屬性可以線上程建立的時候指定。

只需要建立並填充一個 pthrea_attr t型別的執行緒屬性物件ATTR,

並將其作為第二個引數傳遞給pthread create就可以指定新建立執行緒的屬性。

例如,傳遞NULL作為第二個引數,則等價於傳遞一個所有屬性均為預設值的屬性物件。

僅當建立新執行緒的時候執行緒屬性物件才被參考,同一個執行緒物件可用於建立多個執行緒。

在pthread_create之後修改一個執行緒物件並不會修改之前建立的執行緒的屬性。

執行緒分離:

在任何一個時間點上,執行緒都是可結合的。

可結合的執行緒:

1.能夠被其他執行緒收回其資源和殺死,在被其他執行緒回收之前,它的儲存器資源(如棧)是不釋放的,

2.其他執行緒呼叫pthread_join後,那個執行緒才真正中止

分離的執行緒:

1.不能被其他執行緒回收或殺死的,在它執行結束後會由系統自動釋放。

int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); //設定分離狀態屬性

int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate); //獲取分離狀態屬性

//PTHREAD_CREATE_DETACHED ———— 分離態

//PTHREAD_CREATE_JOINABLE ———— 正常態

注意:

如果設定一個執行緒為分離執行緒,而這個執行緒執行又非常快,它很可能在pthread_create函式返回之前就終止了,它終止以後就可能將執行緒號和系統資源移交給其他的執行緒使用,這樣呼叫pthread create的執行緒就得到了錯誤的執行緒號。

要避免這種情況可以 ,採取一定的同步措施,最簡單的方法之一是可以在被建立的執行緒裡呼叫pthread_cond_timewait函式,讓這個執行緒等待一會兒。

設定一段等待時間,是在多執行緒程式設計裡常用的方法。但是注意不要使用諸如wait( )之類的函式,它們是使整個程序睡眠,並不能解決執行緒同步的問題。

設定棧的大小:

int pthread_attr_setstack(); //設定棧的大小

int pthread_attr_getstack(); //獲取棧的大小

如果不想管理棧的分配問題,就用下面的函式,來設定棧的最小大小:

int pthread_attr_setstacksize(); //設定棧的最先大小,如PTHREAD_STACK_MIN (16384) bytes.

int pthread_attr_getstacksize(); //獲取棧的最大大小

如果棧溢位後,會流入緩衝區,下面用來設定緩衝區的大小:

int pthread_attr_setguardsize(); //設定棧溢位後,緩衝區的大小

int pthread_attr_getguardsize(); //獲得棧溢位後,緩衝區的大小

12.4 同步屬性

12.4.1 互斥量屬性

12.4.2 讀寫鎖屬性

12.4.3 條件變數屬性

12.4.4 屏障屬性

不想研究:

參考這些:

12.5 重入

12.6 執行緒特定資料

12.7 取消執行緒

int pthread_setcancelstate(int state, int *oldstate);

//PTHREAD_CANCEL_ENABLE 執行緒是可取消的,這是所有新執行緒的

預設取消狀態

//PTHREAD_CANCEL_DISABLE 執行緒是不可取消的,如果接收到

消請求,它將被阻塞,直到可以celability啟用。

執行緒不是接到取消訊號,就馬上取消,而是需要等到執行以下函式後才會取消

一個這樣的函式稱為一個取消點

執行緒啟動時預設的可取消狀態是PTHREAD CANCEL-ENABLE。

當狀態設為PTHREAD CANCEL-DISABLE時,對pthread_cancel的呼叫並不會殺死執行緒。相反,取消請求對這個執行緒來說還處於掛起狀態,

當取消狀態再次變為PTHREAD-CANCEL-ENABLE時,執行緒將在下一個取消點上對所有掛起的取消請求進行處理。

在還沒到達取消點時,可以通過這個修改取消型別

int pthread_setcanceltype(int type, int *oldtype);

12.8 執行緒和訊號

參考我的部落格:

12.9 執行緒和fork

參考我的部落格:

總結:

一般工程裡就不會在多執行緒裡面,在來搞多程序,不會自己給自己找麻煩

12.10 執行緒和I/O

函式: pread和pwrite ——

隨機讀寫函式