當多個線程操作同一全局變量時,需要對該變量進行保護。推薦使用原子變量,當然也可以使用加鎖。
原子變量,參考官方cplusplus.com/reference/atomic/atomic/,翻譯C++原子變量atomic詳解 - 知乎 (zhihu.com)
鎖,推薦使用 std::lock_guard或std::unique_lock,實現了互斥元的RAII慣用語法(資源獲取即初始化)。該對象在構造時鎖定所給的互斥元,析構時解鎖該互斥元,從而保證被鎖定的互斥元始終被正確解鎖。
unique_lock是對lock_guard的擴展,允許在生命週期內再調用lock和unlock來加解鎖以切換鎖的狀態。
#include<iostream> #include<thread> #include<atomic> //int g_share = 0; std::atomic<int> g_share(0); //原子變量 //#include<mutex> //std::mutex g_mutex; void thread1() { //std::lock_guard<std::mutex> lck(g_mutex); //非原子變量,則需加鎖 while (g_share<20) { g_share++; std::cout << "thread1 " << g_share << std::endl; } } void thread2() { //std::lock_guard<std::mutex> lck(g_mutex); while (g_share<20) { g_share++; std::cout << "thread2 " << g_share << std::endl; } } int main() { std::thread task1(thread1); std::thread task2(thread2); task1.join(); task2.join(); std::cout << "main thread end!" << std::endl; return 0; }