锁、原子变量

当多个线程操作同一全局变量时,需要对该变量进行保护。推荐使用原子变量,当然也可以使用加锁。

原子变量,参考官方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;
}

 

posted @ 2024-02-19 09:45  夕西行  阅读(116)  评论(0编辑  收藏  举报