C++ std::shared_mutex读写锁的使用

C++11中引入的 std::shared_mutex 是一种读写锁,可以在多个线程对同一个数据进行读写的情况下实现线程安全。shared_mutex允许多个线程同时进入读共享区,但只允许一个线程进入写互斥区。

如何使用 shared_mutex

使用 shared_mutex 需要注意以下几点:

1.定义 shared_mutex 对象

2.读共享区,需要使用 shared_lock 对象,调用 lock_shared 函数加锁。

3.写互斥区,需要使用 unique_lock 对象,调用 lock 函数加锁。

4.操作完成后,调用 unlock 函数释放锁。

以下是示例:


#include <iostream>
#include <thread>
#include <mutex>

std::shared_mutex mtx;
int count = 0;

// 读数据
void read_func()
{
    std::cout << "start read_func" << std::endl;
    std::shared_lock<std::shared_mutex> lock(mtx); // 读共享锁加锁
    std::cout << "count = " << count << std::endl;
}

// 写数据
void write_func()
{
    std::cout << "start write_func" << std::endl;
    std::unique_lock<std::shared_mutex> lock(mtx); // 写互斥锁加锁
    count++;
    std::cout << "count = " << count << std::endl;
}

int main()
{
    // 同时启动10个读线程和1个写线程
    std::thread write_thread(write_func);
    std::thread read_threads[10];
    for (int i = 0; i < 10; ++i)
    {
        read_threads[i] = std::thread(read_func);
    }

    write_thread.join();
    for (int i = 0; i < 10; ++i)
    {
        read_threads[i].join();
    }

    return 0;
}

在上面的示例中,我们定义了一个 shared_mutex 对象 mtx,一个全局变量 count。write_func 用于修改 count,read_func 用于读取 count。在 main 函数中,我们启动了一个写线程 write_thread 和 10个读线程 read_threads。read_func 和 write_func 都调用了 std::unique_lock 或 std::shared_lock 的构造函数,并释放了锁。在实际使用中,可以根据具体情况选择是使用 std::unique_lock 还是 std::shared_lock。

下面我们再看一个示例:

#include <iostream>
#include <thread>
#include <shared_mutex>

std::shared_mutex char_mtx;
std::shared_mutex int_mtx;
char c = 'A';
int n = 0;

void read_char()
{
    std::shared_lock<std::shared_mutex> lock(char_mtx);
    std::cout << "Char read: " << c << std::endl;
}

void read_int()
{
    std::shared_lock<std::shared_mutex> lock(int_mtx);
    std::cout << "Int read: " << n << std::endl;
}

void write_char()
{
    std::unique_lock<std::shared_mutex> lock(char_mtx);
    ++c;
    std::cout << "Char write: " << c << std::endl;
}

void write_int()
{
    std::unique_lock<std::shared_mutex> lock(int_mtx);
    ++n;
    std::cout << "Int write: " << n << std::endl;
}

int main()
{
    std::thread t1(read_char);   // 读char
    std::thread t2(read_int);    // 读int
    std::thread t3(write_char);  // 写char
    std::thread t4(write_int);   // 写int
    std::thread t5(read_char);   // 读char
    std::thread t6(read_int);    // 读int

    t1.join();
    t2.join();
    t3.join();
    t4.join();
    t5.join();
    t6.join();

    return 0;
}

在这个示例中,我们使用两个 shared_mutex 变量进行读写操作,分别对应 char 类型和 int 类型的变量。通过五个线程来对这两个变量进行不同的读写操作,其中 t3 和 t4 写线程是互斥的,即不能同时写 char 和 int。其他的读线程可以同时读取 char 和 int。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++ std::shared_mutex读写锁的使用 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C 程序 查找商和余数

    首先我们要明确一下,这里所提到的“C程序查找商和余数”指的是在C语言下进行整数的除法运算,得到商和余数的操作。 接下来,我将为大家提供完整的使用攻略,包括实现代码和使用示例: 1. 实现代码 下面是实现整数除法运算,得到商和余数的一段C语言代码: #include <stdio.h> int main() { int dividend, divi…

    C 2023年5月9日
    00
  • 举例讲解C语言的fork()函数创建子进程的用法

    当我们编写多进程程序时,经常需要使用fork()函数创建子进程。在此为大家详细讲解C语言的fork()函数创建子进程的用法。 什么是fork()函数? fork()函数是一个创建进程的系统调用,调用一次生成两个进程(一个子进程和一个父进程)。两个进程都执行fork()调用后的下一条语句。这个新进程几乎与原先的进程完全一样,除了它有自己独特的进程ID,PID和…

    C 2023年5月23日
    00
  • Visual Studio Code (vscode) 配置C、C++环境/编写运行C、C++的教程详解(Windows)【真正的小白版】

    Visual Studio Code (vscode) 配置C、C++环境/编写运行C、C++的教程详解(Windows)【真正的小白版】 本文将会为大家介绍如何在Windows平台下,使用Visual Studio Code(以下简称vscode)进行C、C++的编写和运行。在本教程中,我们假设我们从零开始,仅具备基本的计算机知识,因此我们将尽可能详细地给…

    C 2023年5月23日
    00
  • C 函数

    C 函数的完整使用攻略 在 C 语言中,函数是一个重要的概念。函数可以将代码分为模块化的单元,使得程序更加易于维护和重构。下面我们将讲解如何完整地使用 C 函数。 函数的结构 C 语言的函数通常由以下部分组成: 返回类型 函数名(参数1类型 参数1名, 参数2类型 参数2名, …) { 函数体 return 返回值; } 返回类型:指定函数的返回值类型。…

    C 2023年5月10日
    00
  • C/C++ 引用作为函数的返回值方式

    C/C++ 中引用是一种特别的数据类型,其本质是指向其他变量地址的别名。引用作为函数的返回值方式,可以避免拷贝对象造成的性能浪费,并且使代码更加简洁易懂。 返回值为左值引用 当函数的返回值声明为左值引用时,我们可以在函数内返回对象的引用,由于返回值是一个引用,因此可以对该对象进行修改。下面是一个简单的例子: #include <iostream>…

    C 2023年5月22日
    00
  • C语言代码实现通讯录管理系统

    C语言代码实现通讯录管理系统 1. 思路 通讯录管理系统主要分为三个模块:显示、添加、删除联系人。首先,我们需要定义一个联系人的结构体,包含姓名、电话、地址等基本信息。然后,通过数组来存储联系人信息,可以通过遍历数组来显示已有联系人,通过添加、删除数组中的元素来添加、删除联系人信息。 2. 代码实现 2.1 定义联系人结构体 在这个管理系统中,我们需要联系人…

    C 2023年5月23日
    00
  • lunc币怎么获得?lunc币怎么买?

    如果你想获得LUNC币,可以通过以下方式: 1. 购买LUNC币 你可以在以下交易平台上购买LUNC币: 火币网 币安 OKEx Gate.io 在购买LUNC币之前,你需要先注册并完成身份认证,这通常需要一些时间。一旦你完成了认证,你可以使用BTC、ETH、USDT等数字货币交换LUNC币。请注意检查交易所的手续费率、存款和提款条件。 例如,你可以使用10…

    C 2023年5月22日
    00
  • 初学C语言基本运算和表达式

    初学C语言基本运算和表达式攻略 C语言是一门计算机编程语言,基本运算和表达式是C语言编程中的基础知识点。在学习这一部分内容时,需要掌握以下知识点: 基本运算符 表达式的运算顺序 数据类型的转换 下面我们来一步步了解这些知识点。 基本运算符 在C语言中,基本运算符包括算术运算符、关系运算符、逻辑运算符和位运算符。 算术运算符 算术运算符包括加(+)、减(-)、…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部