您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++怎么正確使用線程”,在日常操作中,相信很多人在C++怎么正確使用線程問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++怎么正確使用線程”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
CP.26:不要分離線程
通常,生命周期超過創建它的線程的需求繼承自線程任務,但是通過分離(detach)實現這個想法使得監視和與分離的線程進行通信更加困難。在特殊情況下,很難(雖然不是不可能)確保線程可以像期望的那樣中止或繼續動作。
Example(示例)
void heartbeat();
void use()
{
std::thread t(heartbeat); // don't join; heartbeat is meant to run forever
t.detach();
// ...
}
這段代碼是線程的合理用法,其中通常會使用detach()。雖然這個做法存在問題。我們如何監視一個分離的線程以便知道它是否處于活動狀態?心跳線程可能發生某些問題,對于需要心跳功能的系統來說,丟失心跳是很嚴重的問題。因此,我們需要和心跳線程通信(例如通過一個信息流或使用condition_variable的通知事件)。
An alternative, and usually superior solution is to control its lifetime by placing it in a scope outside its point of creation (or activation). For example:
另外一個可選的,通常是更高級的做法是將它放到創建它(或者激活它)的作用域之外。例如:
void heartbeat();
gsl::joining_thread t(heartbeat); // heartbeat is meant to run "forever"
This heartbeat will (barring error, hardware problems, etc.) run for as long as the program does.
心跳線程將會和程序運行同樣長的時間(除非發生錯誤,硬件問題等情況)。
Sometimes, we need to separate the point of creation from the point of ownership:
有時,我們需要將生成視點和所有權視點相分離。
void heartbeat();
unique_ptr<gsl::joining_thread> tick_tock {nullptr};
void use()
{
// heartbeat is meant to run as long as tick_tock lives
tick_tock = make_unique<gsl::joining_thread>(heartbeat);
// ...
}
Flag detach().
標記分離(detach)操作。
到此,關于“C++怎么正確使用線程”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。