• C++ 并发编程,std::unique_lock与std::lock_guard区别示例


    背景

    平时看代码时,也会使用到std::lock_guard,但是std::unique_lock用的比较少。在看并发编程,这里总结一下。方便后续使用。

    std::unique_lock也可以提供自动加锁、解锁功能,比std::lock_guard更加灵活。

    std::lock_guard

    std::lock_guard是RAII模板类的简单实现,功能简单。

    1.std::lock_guard 在构造函数中进行加锁,析构函数中进行解锁。
    2.锁在多线程编程中,使用较多,因此c++11提供了lock_guard模板类;在实际编程中,我们也可以根据自己的场景编写resource_guard RAII类,避免忘掉释放资源。

    下面是一个使用std::lock_guard的代码例子,1+2+ .. + 100的多线程实现,每个num只能由一个线程处理。

    #include <thread>
    #include <mutex>
    #include <vector>
    #include <iostream>
    #include <algorithm>
    
    std::mutex my_lock;
    
    void add(int &num, int &sum){
        while(true){
            std::lock_guard<std::mutex> lock(my_lock);  
            if (num < 100){ //运行条件
                num += 1;
                sum += num;
            }   
            else {  //退出条件
                break;
            }   
        }   
    }
    
    int main(){
        int sum = 0;
        int num = 0;
        std::vector<std::thread> ver;   //保存线程的vector
        for(int i = 0; i < 20; ++i){
            std::thread t = std::thread(add, std::ref(num), std::ref(sum));
            ver.emplace_back(std::move(t)); //保存线程
        }   
    
        std::for_each(ver.begin(), ver.end(), std::mem_fn(&std::thread::join)); //join
        std::cout << sum << std::endl;
    }
    root@ubuntu:~/c++# g++ -std=c++11 -pthread guard.cpp -o guard
    
    root@ubuntu:~/c++# ./guard 
    5050
    root@ubuntu:~/c++# 
  • 相关阅读:
    Python路径表示方法
    Git常用命令
    Docker安装Tomcat
    ubantu环境变量
    ubantu下git的安装和配置(转)
    pycharm基本使用
    Ubuntu18配置搜狗输入法切换时出现中文乱码
    (一) 复杂系统介绍
    python---import模块的本质
    python---第一类对象(First-Class Object)
  • 原文地址:https://www.cnblogs.com/dream397/p/14627916.html
Copyright © 2020-2023  润新知