锁、原子变量
当多个线程操作同一全局变量时,需要对该变量进行保护。推荐使用原子变量,当然也可以使用加锁。
原子变量,参考官方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; }