首页 > 编程语言 >C++中的锁

C++中的锁

时间:2023-01-07 23:14:46浏览次数:59  
标签:std thread lock C++ 互斥 mutex shared

(161 条消息) C++ 互斥对象 std::mutex 与 std::shared_mutex;互斥锁:std::lock_guard、std::unique_lock 与 std::shared_lock 的应用_持续学习,不断沉淀的博客-CSDN 博客_std::lock_guard std::share

C++ 多线程——读写锁 shared_lock/shared_mutex-菜鸟笔记 (coonote.com)

常用的互斥锁: std::mutex​​(互斥对象),std::shared_mutex​​(读写互斥对象)

三个用于代替互斥对象的成员: 管理互斥对象的锁(都是构造加锁,析构解锁):std::lock_guard​ 用于管理 std::mutex​,std::unique_lock​ 与 std::shared_lock​ 管理 std::shared_mutex​。

读锁 ​shared_lock​ 与写锁 ​unique_lock​​: 读共享, 写独占. (c++17才提供支持)

lockguard 粒度大, 故可用 unique_lock 替代 lockguard, 精细控制何处 unlock 锁, 但 unique_lock 由于需要记录锁的状态(最后析构需要判断是否已经释放锁), 效率上会有损耗.

#include <bits/stdc++.h>

using namespace std;

std::shared_mutex mutex_;  //互斥对象

class ReadWriteMutex {
private:
    int value{0};
public:
    int read() const {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::shared_lock<std::shared_mutex> lock(mutex_);// shared_lock共享锁
        printf("value in read thread: %d\n", value);
        return value;
    }

    void write() {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        std::unique_lock<std::shared_mutex> lock(mutex_);// unique_lock独占锁
        value++;
        printf("value in write thread: %d\n", value);
    }
};


int main() {
    ReadWriteMutex readWriteMutex;
    constexpr int n = 10;
    thread tr[n];
    thread tw[n];

    for (int i = 0; i < n; ++i) {
        tr[i] = std::thread(&ReadWriteMutex::read, std::ref(readWriteMutex)); // 必须用std::ref完美转发
    }

    for (int i = 0; i < n; ++i) {
        tw[i] = std::thread(&ReadWriteMutex::write, std::ref(readWriteMutex));
    }

    for (int i = 0; i < n; ++i) {
        tr[i].join();
    }

    for (int i = 0; i < n; ++i) {
        tw[i].join();
    }

    return 0;
}

标签:std,thread,lock,C++,互斥,mutex,shared
From: https://www.cnblogs.com/shmilyt/p/17033808.html

相关文章

  • c++大全
    第一章编程基础 91.1通俗地理解什么是编程语言 91.2C语言究竟是一门怎样的语言? 111.3C语言是菜鸟和大神的分水岭 121.4进制详解:二进制、八进制和十六进制 131.5......
  • c++强制类型转换
    四大强制类型转换使用强制类型转换意味着放弃c++的安全保障static_cast语法static_cast<type-id>(expression)作用将表达式转换为type-id类型注意......
  • C++实现链式表示多项式加法运算
    #include<iostream>#include<cstdlib>usingnamespacestd;#defineMAXSIZE100#defineOK1#defineERROR0typedefintElemtype;typedefintStatus;typedefstructPNo......
  • 纸张尺寸【第十三届蓝桥杯省赛C++C组】
    纸张尺寸在ISO国际标准中定义了\(A0\)纸张的大小为\(1189mm×841mm\),将\(A0\)纸沿长边对折后为\(A1\)纸,大小为\(841mm×594mm\),在对折的过程中长度直接取下整......
  • C++ - TCP/UDP网络编程
    前言socket编程分为TCP和UDP两个模块,其中TCP是可靠的、安全的,常用于发送文件等,而UDP是不可靠的、不安全的,常用作视频通话等。如下图:头文件与库:#include<WinSock2.h>......
  • LLVM IR与C++ MUL函数代码
    LLVMIR与C++MUL函数代码使用LLVMIR写程序熟悉LLVMIR最好的办法就是使用IR写几个程序。在开始写之前,建议先花30分钟-1个小时再粗略阅读下官方手册(https://llvm.org/do......
  • C/C++学生信息管理系统[2023-01-06]
    C/C++学生信息管理系统[2023-01-06]题目6学生信息管理系统(任选)本系统要求设计一个学生信息管理系统,能够进行学生信息的录入、查找,要求考虑查找效率。本题目要求采用......
  • c++ 指针与引用
    引用很易与指针混淆,它们之间有三个主要的不同:不存在空引用。引用必须连接到一块合法的内存。一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候......
  • 数独游戏c++
    问题I:数独游戏时间限制:1.000Sec内存限制:128MB题目描述给你一个N×N的表格(3<N<10),在表格中事先已经填入了一部分的数字,现在请你的表格中空余的格子里填入1~N范围......
  • Dijkstra(迪杰斯特拉)算法C++实现&讲解
    Dijkstra迪杰斯特拉算法及C++实现Dijkstra算法是典型的最短路径路由算法,用来计算一个节点到其他所有节点的最短路径。算法的基本思想和流程是:1.初始化出发点到其它各点的......