您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“C++怎么將線程看作全局容器”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“C++怎么將線程看作全局容器”吧!
CP.24:將線程看作全局容器
To maintain pointer safety and avoid leaks, we need to consider what pointers are used by a thread. If a thread is detached, we can safely pass pointers to static and free store objects (only).
為了維持指針的安全性并避免泄露。我們需要考慮線程使用了什么指針。如果線程被detach了,我們可以(只能)安全地向線程傳遞指向靜態(tài)變量和自由存儲對象的指針。
Example(示例)
void f(int* p)
{
// ...
*p = 99;
// ...
}
int glob = 33;
void some_fct(int* p)
{
int x = 77;
std::thread t0(f, &x); // bad
std::thread t1(f, p); // bad
std::thread t2(f, &glob); // OK
auto q = make_unique<int>(99);
std::thread t3(f, q.get()); // bad
// ...
t0.detach();
t1.detach();
t2.detach();
t3.detach();
// ...
}
通過”O(jiān)K“這個詞我們想表達的是只要線程繼續(xù)使用某個指針,該指針指向的對象就會留在范圍內(nèi)(并保持可用狀態(tài))。通過“bad”這個詞,我們想表達的是線程會在對象銷毀之后使用指向這個對象的指針。這里,線程并發(fā)執(zhí)行這個事實不會影響生命周期和所有權(quán)話題;可以認為這些線程只是some_fct調(diào)用的函數(shù)對象。
Note(注意)
如果被已經(jīng)detach了的線程使用的話,哪怕具有靜態(tài)存儲期間的對象也會發(fā)生問題:如果該線程一直執(zhí)行到程序結(jié)束,它可能和具有靜態(tài)存儲期間的對象的析構(gòu)過程并發(fā)執(zhí)行,對于這樣的對象的訪問可能發(fā)生競爭。
Note(注意)
如果你不會detach線程并且使用gsl::joining_thread,本準(zhǔn)則就是多余的。然而,轉(zhuǎn)換代碼以遵守該準(zhǔn)則會很困難,如果是第三方庫可能根本就無法實現(xiàn)。在這種情況下,為了保證生命周期安全和類型安全,本準(zhǔn)則就變得非常有必要。
通常,無法判斷某個線程是否會執(zhí)行detach操作,但在簡單的常見情況時容易檢測。如果我們無法證明線程不會調(diào)用detach,我們必須假設(shè)它會調(diào)用并且它的生存期間會超過它被構(gòu)造的范圍;接下來就可以適用通常的生命周期和所有權(quán)建議了。
Enforcement(實施建議)
Flag attempts to pass local variables to a thread that might detach().
標(biāo)記企圖將局部變量傳遞給可能detach的線程的情況。
到此,相信大家對“C++怎么將線程看作全局容器”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。