您好,登錄后才能下訂單哦!
本篇內容主要講解“C++多線程程序怎么理解”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++多線程程序怎么理解”吧!
CP.1: 設想你的代碼會成為多線程程序的一部分
很難確定現在不需要并發或者將來的某個時間也不會使用。代碼會被重用的。沒有使用線程的庫有可能被使用線程的、程序的其它部分使用。注意本準則對于功能庫具有最大的緊迫性,而對于單獨的應用程序就沒什么緊迫性。然而,隨著時間的推移,代碼片段會出現在意想不到的地方。
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++多線程程序怎么理解”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。