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 2023年5月22日
    00
  • 编写C语言程序进行进制转换的问题实例

    编写C语言程序进行进制转换的攻略可以分为以下几个步骤: 1. 确定需要实现的进制转换 要进行进制转换,首先需要确定要转换的进制类型,如十进制、二进制、八进制、十六进制等。可以根据需求选择要转换的进制类型。 2. 设计算法并实现程序代码 经过确定要转换的进制类型,就需要设计转换的算法。通常,将一个进制的数转换为另一个进制的数可以借助中间进制完成,例如将二进制数…

    C 2023年5月23日
    00
  • C语言中如何进行多语言支持?

    在C语言中进行多语言支持,其主要的实现方式是通过字符串本地化来实现的。具体步骤如下: 1. 设计国际化字符串 首先,我们需要将所有需要支持的语言的字符串收集到一个字符串池中,并将它们按照关键字进行分类,这个过程被称为字符串本地化(Localization)。例如: // 中文 char *zh[] = { "你好", "世界&q…

    C 2023年4月27日
    00
  • C语言实现3个数从小到大排序/输出的方法示例

    C语言实现3个数从小到大排序/输出的方法示例 问题描述 C语言中如何实现3个数从小到大排序/输出? 解决方案 #include <stdio.h> int main() { int a, b, c; printf("请输入三个整数:\n"); scanf("%d%d%d", &a, &b, …

    C 2023年5月30日
    00
  • 关于C++中sort()函数的用法,你搞明白了没

    介绍C++中sort()函数的用法,有以下几点要点: sort()函数介绍 sort()函数是C++标准模板库(STL)中的一个常用算法,用于对数组或容器元素进行排序,其函数原型如下: template <class RandomAccessIterator> void sort ( RandomAccessIterator first, Ran…

    C 2023年5月22日
    00
  • C语言中栈的两种实现方法

    C语言中栈是一种常用的数据结构,常用于程序中的内存管理、函数调用等场景。在C语言中,栈的实现方法主要有两种:数组实现和链表实现。 数组实现 数组实现是一种简单、直接、易于理解和操作的方式。栈的数组实现要求开辟一段连续的内存空间,容量为栈的最大大小,在程序运行时空间大小固定,但在使用时效率高,适合空间比较紧张的场景。 下面是一个数组实现的栈结构的示意代码: #…

    C 2023年5月23日
    00
  • C程序 查找姓名首字母

    下面是C程序“查找姓名首字母”的完整使用攻略! 程序概述 本程序的主要功能是在用户输入的名字中,查找给定首字母的姓名。具体实现方式为,读取用户输入的姓名,然后用循环逐一比较每个姓名的首字母,最后输出符合要求的姓名。本程序具有较好的通用性,可用于各种名字查找场景。 程序使用方法 下载并安装C编译器:如Turbo C、VS等,以便编译运行程序。 打开编译器,打开…

    C 2023年5月9日
    00
  • Dev-C++调试方法的具体使用

    当使用Dev-C++进行C/C++项目开发时,我们可能会遇到一些问题,如程序崩溃、变量值不正确等。这时候我们就需要使用Dev-C++的调试功能来定位问题。下面是具体使用步骤: 1. 启用调试模式 首先,我们需要在编译选项中启用调试模式。在菜单栏中选择“项目”-“选项”-“编译器”-“调试”选项卡,勾选“生成调试信息”和“生成调试版代码”,然后点击“确定”按钮…

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