溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++怎么將線程看作全局?容器

發(fā)布時間:2021-11-25 15:57:02 來源:億速云 閱讀:112 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“C++怎么將線程看作全局容器”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“C++怎么將線程看作全局容器”吧!

CP.24:將線程看作全局容器

Reason(原因)

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í)!

向AI問一下細節(jié)

免責(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)容。

c++
AI