C 多執行緒和原子操作 2017 7 20

2021-08-04 00:03:33 字數 2250 閱讀 5359

多執行緒和原子操作

這些都是c++11引入的類庫,從此以後,c++語言本身有了併發程式設計的能力,非常酷。乙個 thread類,三五行**,就可以啟動乙個執行緒,簡單的使用mutex和lock_guard ,就可以完成執行緒間的資源同步與保護,棒極了。

本篇部落格主要介紹c++ 的多執行緒機制。

多執行緒是多工處理的一種特殊形式,多工處理允許讓電腦同時執行兩個或兩個以上的程式。一般情況下,兩種型別的多工處理:基於程序和基於執行緒。

多執行緒程式包含可以同時執行的兩個或多個部分。這樣的程式中的每個部分稱為乙個執行緒,每個執行緒定義了乙個單獨的執行路徑。

c++11 新標準中引入了四個標頭檔案來支援多執行緒程式設計,他們分別是,,,和。

本篇博文研究的是thread標頭檔案中的類:

我們來看第乙個利用c++11特性建立執行緒的例子:

thread (thread&& x) noexcept;
(1). 預設建構函式,建立乙個空的 thread 執行物件。

(2). 初始化建構函式,建立乙個 thread物件,該 thread物件可被 joinable,新產生的執行緒會呼叫 fn 函式,該函式的引數由 args 給出。

(3). 拷貝建構函式(被禁用),意味著 thread 不可被拷貝構造。

(4). move 建構函式,move 建構函式,呼叫成功之後 x 不代表任何 thread 執行物件。

注意:可被 joinable 的 thread 物件必須在他們銷毀之前被主線程 join 或者將其設定為 detached.

看乙個例子:

這個例子中建立了兩個執行緒,其中乙個執行緒函式帶引數,大家仔細分析上面的thread類的構函式,看如何建立執行緒。

也有可能是這樣的

大家的輸出可能不是這樣,有可能是下面這樣的,不要緊,因為這個例子中沒使用多執行緒的非同步機制,執行緒之間存在競爭,看稍後文章講解所以輸出可能是下面這樣的情況。

參考**:

move (1)

thread& operator= (thread&& rhs) noexcept;
copy [deleted] (2)

thread& operator= (const thread&) = delete;
看下面的例子。// example for thread::operator=  

多執行緒 原子操作

include include includeint sum 0 多個執行緒同時訪問 讀 寫 乙個變數,就會發生衝突。乙個變數的執行緒安全 多個執行緒同時讀寫沒有誤差。解決方法 臨界區 事件機制 互斥量 原子操作 原子操作的 速度快於 臨界區 事件機制 互斥量 原子操作函式,解決多執行緒安全 dwo...

cuda 原子鎖 多執行緒操作 通用原子操作

在專案中,空間中有200w 的點,需要對映到乙個grid map的600 600的網格中,落入到同乙個格仔的點需要進行一些計算獲得乙個值。對於格仔與格仔之間是並行的,但格仔之中的點需要設計為序列。所以在計算某個格仔中的點時,需要將格仔的值保護起來,只允許乙個執行緒 點 計算並改變。這裡就用到了cud...

C 11多執行緒的原子操作

原子操作是同時只能有乙個執行緒執行乙個操作,不用使用互斥量即可實現,但是速度慢,而且一般只支援原生的型別,不夠靈活。更多的用處是作為訊號量進行使用。示例 以int為例子 include include include include include int cnt 0 std atomic int ...