前面有多篇原創部落格或譯文介紹了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 多執行緒支援庫,內容豐富 功能強大。首先從我個人理解角度粗鄙的理解一下多執行緒。多執行緒眾所周知 切割時間片的多程式併發執行,大多數的計算機都支援多執行緒併發的硬體支援。這可能是最簡單的多執行緒程式了。多...