首页 > 其他分享 >使用互斥量保护共享数据

使用互斥量保护共享数据

时间:2024-03-24 22:12:49浏览次数:25  
标签:std 保护 some list 互斥 guard mutex 共享

C++中通过实例化 std::mutex 创建互斥量, 通过调用成员函数lock()进行上锁, unlock()进行解锁。 不过, 不推荐实践中直接去调用成员函数, 因为调用成员函数就意味着, 必须记住在每个函数出口都要去调用unlock(), 也包括异常的情况。

C++标准库为互斥量提供了一个RAII语法的模板类 std::lock_guard , 其会在构造的时候提供已锁的互斥量, 并在析构的时候进行解锁, 从而保证了一个已锁的互斥量总是会被正确的解锁。 

下面的程序清单中, 展示了如何在多线程程序中, 使用 std::mutex 构造的 std::lock_guard 实例, 对一个列表进行访问保护。 std::mutexstd::lock_guard 都在 <mutex> 头文件中声明。 

#include <list>
#include <mutex>
#include <algorithm>
std::list<int> some_list; // 1
std::mutex some_mutex; // 2
void add_to_list(int new_value)
{
    std::lock_guard<std::mutex> guard(some_mutex); // 3
    some_list.push_back(new_value);
} 
bool list_contains(int value_to_find)
{
    std::lock_guard<std::mutex> guard(some_mutex); // 4
    return std::find(some_list.begin(),some_list.end(),value_to_find) != some_list.end(); 
}

上面代码中有一个全局变量①, 这个全局变量被一个全局的互斥量保护②。 add_to_list()③和list_contains()④函数中使用 std::lock_guard<std::mutex> , 使得这两个函数中对数据的访问是互斥的: list_contains()不可能看到正在被add_to_list()修改的列表。 

虽然某些情况下, 使用全局变量没问题, 但在大多数情况下, 互斥量通常会与保护的数据放在同一个类中, 而不是定义成全局变量。 这是面向对象设计的准则: 将其放在一个类中, 就可让他们联系在一起, 也可对类的功能进行封装, 并进行数据保护。 在这种情况下, 函数add_to_listlist_contains可以作为这个类的成员函数。 互斥量和要保护的数据, 在类中都需要定义为private成员, 这会让访问数据的代码变的清晰, 并且容易看出在什么时候对互斥量上锁。 当所有成员函数都会在调用时对数据上锁, 结束时对数据解锁, 那么就保证了数据访问时不变量不被破坏。 

但当其中一个成员函数返回的是保护数据的指针或引用时, 会破坏对数据的保护。 具有访问能力的指针或引用可以访问(并可能修改)被保护的数据, 而不会被互斥锁限制。 互斥量保护的数据需要对接口的设计相当谨慎, 要确保互斥量能锁住任何对保护数据的访问, 并且不留后门。 

标签:std,保护,some,list,互斥,guard,mutex,共享
From: https://www.cnblogs.com/love-9/p/18093188

相关文章

  • AD域服务和文件共享设置
    1.先把S端和C端ping通ip 2.S端安装域控服务 3.S端域控升级 4.C端加入S端设置的域林  5.S端设置user  6.设置李四和张三权限  7.登录张三并测试权限   8.在S端查看张三写入 9.登录李四并测试权限   10.这里就已经做完 发现李四......
  • 关于window AD域服务文件共享
    1.在vm里面创建两台windows的机器 win2012 和 win2010  2.配置两台机器的IP 测试两台机器的连通性3.将win12作为服务器  win10作为客户端  在win12服务管理器中安装ActiveDirectory域服务 安装完成后会自动重启  4.在win12上面创建XXX.com的......
  • 关于AD域服务和文件共享设置
    1.创建两台虚拟机win12(服务器)win10(客户机)2登录两台虚拟机设置win12为dns服务器,并且设置两台虚拟机在同一网段,然后测试连通性 3.在win12虚拟机上打开下载AD域服务,然后设置新域(自己姓名加学号),然后重启保存    4.把win10虚拟机加入自己创建的域里面,然后重启保存......
  • Spark重温笔记(三):Spark在企业中为什么能这么强?——持久化、Checkpoint机制、共享变量与
    Spark学习笔记前言:今天是温习Spark的第3天啦!主要梳理了Spark核心数据结构:RDD(弹性分布式数据集),包括RDD持久化,checkpoint机制,spark两种共享变量以及spark内核调度原理,希望对大家有帮助!Tips:"分享是快乐的源泉......
  • 06_FreeRTOS临界段代码保护及调度器挂起与恢复
    FreeRTOS临界段代码保护及调度器挂起与恢复临界段代码保护简介临界段代码保护函数介绍任务调度器的挂起和恢复......
  • C++共享之道:用extern实现源文件变量与类成员函数的巧妙共享
    概述:在C++中,使用`extern`关键字可实现在源文件之间共享变量与类成员函数。通过声明变量或类在头文件中,再在一个源文件中定义,其他源文件通过`extern`引用,促使模块化、可维护的代码组织。在C++中,extern关键字可用于在源文件之间共享变量。它告诉编译器某个变量的声明在其他源文......
  • Windows 服务启动共享目录
    privatevoidFormMain_Load(objectsender,EventArgse){ShareDirec();}publicvoidShareDirec(){ManagementClassmanagement=newManagementClass("Win32_share");ManagementBaseObjectinParams=management.GetMethodParameters(&qu......
  • 【等保测评】网络安全等级保护测评 S3A3 安全物理环境 详解
    转自:https://mp.weixin.qq.com/s/gUvHNaCkOagAcJHnakdU5Q网络安全等级保护测评S3A3安全物理环境详解概述网络安全等级保护S3A3安全物理环境中主要包括以下10个部分:物理位置选择、物理访问控制、防盗窃和防破坏、防雷击、防火、防水和防潮、防静电、温湿度控制、电力供应、电磁......
  • Linux线程互斥
    文章目录Linux线程互斥mutex接口初始化互斥量销毁互斥量加锁和解锁加锁解锁的原理使用示例Linux线程互斥进程线程间的互斥相关背景概念临界资源:多线程执行流共享的资源就叫做临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有......
  • 如何实现Mac与Windows共享文件夹?
    本人使用系统是macos13.1和win11系统亲测使用!第一步确保两台电脑链接相同的WIFI这一步非常关键第二步Windows电脑创建共享文件夹并设置文件共享首先在Window端桌面创建一个共享文件夹。(也可以自己更改需要存储的路径)接着右键属性--选择共享--高级共享--勾选共......