目錄
一:Atomic:
二:Thread
1. 創建線程
2. 小心移動(std::move)線程
3. 如何創建帶參數的線程
4. 線程參數是引用類型時,要小心謹慎。
5. 獲取線程ID
6. jthread
7. 如何在線程中使用中斷 stop_token
三:如何解決數據競爭
1.有問題的代碼
2.使用互斥
3.預防死鎖
4. 自動釋放鎖
5. 延遲鎖
6. 共享鎖
7. 線程安全的初始化
四:線程局部存儲
五:線程通信
1.條件變量
2. 防止虛假喚醒
3. 防止喚醒丟失
4.信號量
5. std::latch
六:任務
1. std::promise, std::future
2. 用std::promise, std::future進行線程同步
3. std::async
4. std::package_task
一:Atomic:
#include <atomic>
#include <thread>
#include <iostream>using namespace std;std::atomic_int x, y;
int r1, r2;
void writeX() {x.store(1);r1 = y.load();
}
void writeY() {y.store(1);r2 = x.load();
} int main() {for (int i = 0; i < 100; i++){x = 0;y = 0;std::thread a(writeX);std::thread b(writeY);a.join();b.join();std::cout << r1 << r2 << std::endl;}return 0;
}
//可能的輸出有三種情況:01, 10, 11
//01:先執行線程a, 再執行線程b
//10:先執行線程b,再執行線程a
//11:執行線程a一半后調度到線程b,然后再回來
二:Thread
1. 創建線程
#include <atomic>
#include <threa