溫馨提示×

溫馨提示×

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

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

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

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

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

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

Reason(原因)

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

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.

雖然緩存計算可以在單線程環(huán)境中運行得很完美,但在多線程環(huán)境中,兩個靜態(tài)變量處于數(shù)據(jù)競爭狀態(tài),因此會導(dǎo)致無定義的行為。

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;    }};

這段代碼中,緩存數(shù)據(jù)存作為ComputationCache對象的數(shù)據(jù)成員存儲,而不是靜態(tài)的狀態(tài)數(shù)據(jù)。這個重構(gòu)從根本上將決定權(quán)向上委托給調(diào)用者:單線程程序可以繼續(xù)使用全局的ComputationCache實例,而多線程程序可以每個線程管理一個ComputationCache實例,或者每個上下文一個實例,這個上下文可以有多種解釋。重構(gòu)的函數(shù)不再試圖管理cached_x的內(nèi)存分配。從這個角度來講,這算是單獨責(zé)任原則的一個應(yīng)用。

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

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

  • Mark the state variables as thread_local instead of static.

  • 將狀態(tài)變量定義為線程內(nèi)部的局部變量而不是靜態(tài)變量。

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

  • 實現(xiàn)并發(fā)控制,例如,使用靜態(tài)的std::mutex保護(hù)對兩個靜態(tài)變量的訪問。

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

  • 拒絕在多任務(wù)環(huán)境中編譯或執(zhí)行代碼。

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

  • 提供兩種實現(xiàn):一個用于單線程環(huán)境,另一個用于多線程環(huán)境。


Exception(例外)

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

永遠(yuǎn)不會運行于多線程環(huán)境的代碼。

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

到此,相信大家對“C++多線程程序怎么理解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI