亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

C++多線程程序怎么理解

發布時間:2021-11-25 16:11:51 來源:億速云 閱讀:134 作者:iii 欄目:大數據

本篇內容主要講解“C++多線程程序怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++多線程程序怎么理解”吧!

CP.1: 設想你的代碼會成為多線程程序的一部分

Reason(原因)

很難確定現在不需要并發或者將來的某個時間也不會使用。代碼會被重用的。沒有使用線程的庫有可能被使用線程的、程序的其它部分使用。注意本準則對于功能庫具有最大的緊迫性,而對于單獨的應用程序就沒什么緊迫性。然而,隨著時間的推移,代碼片段會出現在意想不到的地方。

Example, bad(反面示例)

double cached_computation(double x)
{
   // bad: these statics cause data races in multi-threaded usage
   static double cached_x = 0.0;
   static double cached_result = COMPUTATION_OF_ZERO;

   if (cached_x != x) {
       cached_x = x;
       cached_result = computation(x);
   }
   return cached_result;
}

Although cached_computation works perfectly in a single-threaded environment, in a multi-threaded environment the two static variables result in data races and thus undefined behavior.

雖然緩存計算可以在單線程環境中運行得很完美,但在多線程環境中,兩個靜態變量處于數據競爭狀態,因此會導致無定義的行為。

Example, good(范例)


struct ComputationCache {    double cached_x = 0.0;    double cached_result = COMPUTATION_OF_ZERO;
   double compute(double x) {        if (cached_x != x) {            cached_x = x;            cached_result = computation(x);        }        return cached_result;    }};

這段代碼中,緩存數據存作為ComputationCache對象的數據成員存儲,而不是靜態的狀態數據。這個重構從根本上將決定權向上委托給調用者:單線程程序可以繼續使用全局的ComputationCache實例,而多線程程序可以每個線程管理一個ComputationCache實例,或者每個上下文一個實例,這個上下文可以有多種解釋。重構的函數不再試圖管理cached_x的內存分配。從這個角度來講,這算是單獨責任原則的一個應用。

在這個特定的例子中,目的在于線程安全的重構同時提高了單線程環境中的重用性。不難想象單線程有可能需要兩個用于程序不同部分的ComputationCache實例,而不會發生緩存數據的相互覆蓋。

存在很多其他的方式,其中一個是為了在標準的多線程環境(即,使用并發的唯一形式std::thread)中運行的代碼中增加線程安全處理。

  • Mark the state variables as thread_local instead of static.

  • 將狀態變量定義為線程內部的局部變量而不是靜態變量。

  • Implement concurrency control, for example, protecting access to the two static variables with a static std::mutex.

  • 實現并發控制,例如,使用靜態的std::mutex保護對兩個靜態變量的訪問。

  • Refuse to build and/or run in a multi-threaded environment.

  • 拒絕在多任務環境中編譯或執行代碼。

  • Provide two implementations: one for single-threaded environments and another for multi-threaded environments.

  • 提供兩種實現:一個用于單線程環境,另一個用于多線程環境。


Exception(例外)

Code that is never run in a multi-threaded environment.

永遠不會運行于多線程環境的代碼。

需要小心的是:存在很多事例本來被認為永遠不會運行于多線程程序的代碼最后成為多線程程序的一部分,通常是幾年之后。一般來講,為這樣的程序消除數據競爭會非常痛苦。因此,一旦決定代碼永遠不會在多線程環境中運行,應該清晰地標記出來,而且最好同時提供編譯和運行時的強制機制以盡早捕捉錯誤的用法。

到此,相信大家對“C++多線程程序怎么理解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

吉林省| 色达县| 斗六市| 广德县| 茌平县| 云和县| 桃园县| 原阳县| 三江| 道孚县| 西林县| 金门县| 东阳市| 辽源市| 上虞市| 宁化县| 定兴县| 桐庐县| 凤凰县| 游戏| 确山县| 蓝田县| 蛟河市| 贵南县| 进贤县| 太仆寺旗| 新蔡县| 鄱阳县| 鹿邑县| 阳曲县| 宽城| 视频| 巴南区| 宿迁市| 芒康县| 宜章县| 夹江县| 涞水县| 云阳县| 齐齐哈尔市| 巴塘县|