C 11多執行緒的侷限

2021-09-22 06:13:35 字數 1250 閱讀 7502

前面有多篇原創部落格或譯文介紹了c++11多執行緒的種種用法,但是在實際使用中,筆者卻發現了c++11多執行緒的一些較嚴重的侷限。目前看到的,主要有下面2個:

不支援類似於pthread_cancel()的功能

不支援類似於pthread_exit()這樣的讓當前執行緒立即退出的功能

因此,c++11的多執行緒一旦執行起來,很難有簡單的方法來讓單個指定的執行緒結束。

這樣就會有一些問題,比如,使得程式設計不方便。舉個例子:起n個執行緒,執行時間各不相同;要求:當第乙個執行緒執行結束時,其他執行緒立即或盡快停止。

要實現這個需求,可能有多種方法:

設乙個監控執行緒,它發現第乙個執行緒結束後,負責pthread_cancel其他執行緒;但因為c++11多執行緒不支援pthread_cancel類似的功能,因此做不到;

和方法1類似,設定乙個監控執行緒,當發現需要結束所有其他執行緒時,利用c++11多執行緒的thread::native_handle()方法獲得工作執行緒的tid,利用 pthread_kill(tid, sigterm) 函式給這些工作執行緒傳送sigterm訊號,並要求在之前就安裝好訊號處理函式,而在訊號處理函式中呼叫的就是 pthread_exit(null) 了。例項**如下:

static void on_signal_term(int sig)

void thread_kill(void)

});pthread_t tid = t->native_handle();

cout << "tid=" << tid << endl;

// 確保子執行緒已經在執行。

this_thread::sleep_for( chrono::seconds(1) );

pthread_kill(tid, sigterm);

t->join();

delete t;

cout << "thread destroyed." << endl;

}

每個執行緒定期監控乙個全域性變數。該全域性變數初始化為false,第乙個結束的執行緒設定此全域性變數為true. 當其他執行緒定期檢查發現該全域性變數為true時,因為c++11多執行緒不支援pthread_exit()類似功能,因此只好立即呼叫return以結束當前執行緒. 但是注意,在某些特殊情況下,這樣比較麻煩。比如每個執行緒的執行緒函式都呼叫了乙個遞迴函式,那麼就需要在這個遞迴函式中存在定期檢查全域性變數的**,並且還需要有邏輯使其發現全域性變數為true以後,立即一路返回到頂上。

以上是最近遇到的有趣問題,略作筆記。

(完)

C 11 多執行緒

新特性之描述 雖然 c 11 會在語言的定義上提供乙個記憶體模型以支援執行緒,但執行緒的使用主要將以 c 11 標準庫的方式呈現。c 11 標準庫會提供型別 thread std thread 若要執行乙個執行緒,可以建立乙個型別 thread 的實體,其初始引數為乙個函式物件,以及該函式物件所需要...

c 11 多執行緒

1.多執行緒的原理 同一時間內,cpu只能處理1條執行緒,只有1條執行緒在工作 執行 多執行緒併發 同時 執行,其實是cpu快速地在多條執行緒之間排程 切換 如果cpu排程執行緒的時間足夠快,就造成了多執行緒併發執行的假象。思考 如果執行緒非常非常多,會發生什麼情況?cpu會在n多執行緒之間排程,c...

C 11 多執行緒

2011 年 c 迎來重大的改革 語言層面上承認了 多執行緒 程式的存在 加入了 thread 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...