Linux同步拾遺

2021-05-24 02:11:47 字數 2215 閱讀 6769

一般情況下,執行緒在主題函式退出的時候會自動終止,但同時也可以因為接收到另乙個執行緒發來的終止請求而強制終止。

執行緒取消的方法是向目標執行緒發cancel訊號,但如何處理cancel訊號則由目標執行緒自己決定,或者忽略,或者立即終止,或者繼續執行到cancelation-point(取消點),由不同cancelation狀態決定。

執行緒收到cancel訊號的卻醒處理是繼續執行到取消點,也就是設定乙個canceled狀態,執行緒繼續執行,只有執行到cancelation-point的時候才會退出。

根據posix標準,pthread_join,pthread_testcancel,pthread_cond_wait,pthread_cond_timedwait,sem_wait,sigwait以及read,write等會引起足賽的系統帶哦用都是取消點,而其他pthread函式都不會引起cancelation動作。但是pthread_cancel的手冊聲稱,由於linuxthread庫與c庫結合得不好,因而目前c庫函式都不是cancelation-point;但cancel訊號會使執行緒從足賽的系統呼叫中退出,並置eintr錯誤碼,因此可以在需要作為cancelation-point的系統呼叫前後呼叫pthread_testcancel(),從而達到posix標準所要求的目標。

如果執行緒處於無限迴圈中,且迴圈體內沒有執行至取消點的必然路徑,則執行緒無法由外部其他執行緒的取消請求而終止,因此在這樣的迴圈體的必經路徑上應該加入pthread_testcancel()呼叫。

與執行緒取消有關的pthread函式:

int pthread_cancel(pthread_t thread);

傳送終止訊號給執行緒,如果成功則返回0,否則非0。

int pthread_setcancelstate(int state, int *oldstate)

設定本執行緒對cancel訊號的反應。

int pthread_setcanceltype(int type, int* oldtype)

設定本縣成取消動作的執行實際,type由兩種趣旨:pthread_cancel_deffered和pthread_cancel_asynchronous,僅當cancel狀態為enable時,分表表示收到訊號後繼續執行至下乙個取消點再退出和立即執行取消動作(退出)。

void pthread_testcancel()

檢查本縣成是否處於cancel狀態,如果是,則進行取消動作。

pthread_join用來等待乙個執行緒的結束。函式原型為:

extern int pthread_join __p(pthread_t __th, void** __thread_return);

第乙個引數為被等待的執行緒識別符號,第二個引數為乙個使用者定義的指標,它用來儲存執行緒返回值。這個函式是乙個足賽函式,呼叫它的函式將一直等待到被等待的執行緒結束為止,當函式返回時,被等待執行緒的資源被**。在linux中預設情況下在乙個執行緒被建立後必須使用此函式對建立的執行緒進行資源**,但是可以設定threadattributes來設定當乙個執行緒結束時直接**此執行緒占用的系統資源。

linux還有為執行緒在取消點退出而準備的pthread_cleanup_push,pthread_cleanup_pop。

pthread_cond_wait()函式一進入wait狀態就會自動release mutex.

pthread_cond_wait()函式一旦wait成功獲得cond條件的時候就會自動lock mutex.

乙個經典的cond_wait/broadcast使用:

pthread_mutex_lock(&mut);

while (x <= y)

/* modifies on x and y */

pthread_mutex_unlock(&mut);

pthread_mutex_lock(&mut);

if (x > y) pthread_cond_signal(&cond);

pthread_mutex_unlock(&mut);

表面上signal只喚醒第乙個執行緒,broadcast喚醒全部執行緒,但是pthread_cond_signal在多處理器上可能同時喚醒多個執行緒。

至於為什麼被喚醒之後還要再次進行條件判斷(即為什麼要使用while迴圈來判斷條件),是因為可能有驚群現象。

自旋鎖是為實現保護共享資源而提出的一種鎖機制,與互斥鎖不同,它會先迴圈等待鎖是否已經釋放,一般來說,自旋鎖有乙個引數限定最多持續嘗試次數,超出後,自動放棄當前time slice,等下一次機會。自選所比較適用於鎖保持著保持鎖比較短的情況。

linux 命令拾遺

這個命令會列印出八進位制 十六進製制和十進位制的ascii碼表。xxd可以生成所給與檔案的十六進製制拷貝,也可以將編輯好的十六進製制拷貝還原成二進位制格式。它也可以將十六進製制拷貝輸出成c的陣列 隨機從乙個檔案或資料夾中選擇行 檔案 資料夾 產生從某個數到另外乙個數之間的所有整數 timeout 執...

Linux常見命令拾遺

0.1 使用 表示該部分需要根據你的實際情況替換1.軟體安裝解除安裝類 徹底移除軟體 apt get purge remove soft name2.檔案操作 重新命名檔案 mv filename1 filename23.許可權操作 任何人都有讀 寫 執行三項許可權 chown 777 filena...

asp知識拾遺

最近做的乙個小 碰到了許多問題,能解決的都解決了,還有的沒辦法就找了替代的解決辦法.下面收集一下 1 在選擇了一系列的checkbox後的提交表單提交後,會獲取到name1,逗號,空格,name2,逗號,空格,結果,系統需要獲取這些值,我用了以下 實現.uname request.form user...