C 11多執行緒 一 語言層面的併發

2021-07-09 02:45:19 字數 2114 閱讀 5168

參考連線: 目錄

1.與 c++11 多執行緒相關的標頭檔案

2.簡單的示例

3.sleep_for,讓執行緒睡一會

4.mutex,互斥加鎖

c++11開始支援多執行緒程式設計,之前多執行緒程式設計都需要系統的支援,在不同的系統下建立執行緒需要不同的api如pthread_create(),createthread(),beginthread()等,使用起來都比較複雜,c++11提供了新標頭檔案、、、等用於支援多執行緒,並且有很好的平台移植性。

1.與 c++11 多執行緒相關的標頭檔案

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

:該頭文主要宣告了兩個類, std::atomic 和 std::atomic_flag,另外還宣告了一套 c 風格的原子型別

和與 c 相容的原子操作的函式。

:該標頭檔案主要宣告了 std::thread 類,另外 std::this_thread 命名空間也在該標頭檔案中。

:該標頭檔案主要宣告了與互斥量(mutex)相關的類,包括 std::mutex 系列類,std::lock_guard,

std::unique_lock, 以及其他的型別和函式。

:該標頭檔案主要宣告了與條件變數相關的類,包括 std::condition_variable 和

std::condition_variable_any。

:該標頭檔案主要宣告了 std::promise, std::package_task 兩個 provider 類,以及 std::future 和

std::shared_future 兩個 future 類,另外還有一些與之相關的型別和函式,std::async() 函式就宣告在此標頭檔案中。

2.簡單的示例

使用join來阻塞主線程,直到子執行緒結束;

並使用lambda表示式寫子執行緒呼叫的函式;

使用mutex來加鎖,讓子執行緒依次呼叫lock與unlock之間的**;

並將mutex變數,引用的方式傳入lambda函式。

#include "stdafx.h"

#include using namespace std;

#include #include #include void hello()

int _tmain(int argc, _tchar* argv)

) ); }

for (auto& threadvar:threads)

cout << "main thread id:" <

輸出:

lambda thread id:9044

lambda thread id:1388

lambda thread id:7984

lambda thread id:7144

lambda thread id:7176

main thread id:6264

請按任意鍵繼續. . .

3.sleep_for,讓執行緒睡一會

#include "stdafx.h"

#include using namespace std;

#include #include #include int _tmain(int argc, _tchar* argv)

});thread thread2([&mutexvar]();

fun();//呼叫lambda函式

mutexvar.unlock();}})

);}

for (auto& threadvar:threads)

cout << "main thread id:" << this_thread::get_id() << endl;

cout << "ntextnum:" << ntextnum << endl;

return 0;

}

輸出:

main thread id:1760

ntextnum:50000

請按任意鍵繼續. . .

如果遮蔽lock(),輸出值ntextnum<50000,共享資料操作應該使用mutex。

C 11 併發 多執行緒

通常情況下,原子操作是通過互斥 mutual exclusive 的訪問來保證的。linux下借助posix標準的pthread庫的互斥鎖 include include using namespace std static long long total 0 pthread mutex t m p...

C 11併發程式設計 多執行緒std thread

c 11引入了thread類,大大降低了多執行緒使用的複雜度,原先使用多執行緒只能用系統的api,無法解決跨平台問題,一套 平台移植,對應多執行緒 也必須要修改。現在在c 11中只需使用語言層面的thread可以解決這個問題。所需標頭檔案 thread noexcept 乙個空的std thread...

C 11 多執行緒 併發程式設計總結

建立std thread,一般會繫結乙個底層的執行緒。若該thread還繫結好函式物件,則即刻將該函式執行於thread的底層執行緒。執行緒相關的很多預設是move語義,因為在常識中線程複製是很奇怪的行為。joinable 是否可以阻塞至該thread繫結的底層執行緒執行完畢 倘若該thread沒有...