第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 ——
隨機讀寫函式