当前位置: 首页 > news >正文

c++ 互斥锁使用详解 lock_guard

c++ 互斥锁使用详解

std::mutex

  • 用于保护共享资源,防止多个线程同时修改共享资源而引发竞争条件。

成员函数

  • lock:锁定互斥,若互斥不可用则阻塞。
  • try_lock:尝试锁定互斥,若互斥不可用则返回。
  • unlock:解锁互斥。

推荐使用方法

  • 不推荐直接调用 std::mutex 的成员函数,若按此处理,则在多条代码路径都要调用 unlock,包括由于异常导致退出的路径。
  • 推荐使用 std::unique_lock 或 std::lock_guard,以上两个类模板针对互斥锁实现了 RAII 手法:在构造时给互斥加锁,在析构时解锁,从而保证互斥锁总被正确解锁。

示例代码

  • 以下示例演示了两个线程交替写一个文件:

    #include <stdio.h>
    #include <string.h>
    #include <thread>
    #include <mutex>std::mutex g_mutex;void f1(FILE *fp)
    {// 获取互斥锁std::lock_guard<std::mutex> lk(g_mutex);// c++17 以上可以这样写·// std::lock_guard lk(g_mutex);// 进入临界区,访问共享资源const char* s = "thread1: hello\n";fwrite(s, strlen(s), 1, fp);// RAII,自动解锁
    }void f2(FILE *fp)
    {// 获取互斥锁std::lock_guard<std::mutex> lk(g_mutex);// c++17 以上可以这样写·// std::lock_guard lk(g_mutex);// 进入临界区,访问共享资源const char* s = "thread2: hello\n";fwrite(s, strlen(s), 1, fp);// RAII,自动解锁
    }int main()
    {// 新建文件FILE* fp = fopen("test.txt", "wt");// 创建线程std::thread t1(f1, fp);std::thread t2(f2, fp);// 等待线程结束t1.join();t2.join();// 关闭文件fclose(fp);return 0;
    }
    
http://www.lryc.cn/news/217336.html

相关文章:

  • 【快速解决】Android Button页面跳转功能
  • C语言 pthread_create
  • 前端uniapp提交表单调用接口方法最新
  • OpenFeign的简单介绍和功能实操
  • webpack 高级
  • OLE DB 访问接口所需的(最大)数据长度为 18,但返回的数据长度为 6。
  • oracle (9)Storage Relationship Strut
  • React 项目结构小结
  • 4.网络之TCP
  • 电池原理与分类
  • Mongoose 开源库--Filesystem(文件系统)使用笔记
  • 新兴初创企业参展招募
  • 【Linux】Nginx安装使用负载均衡及动静分离(前后端项目部署),前端项目打包
  • 银行和金融企业为何青睐这8款项目管理工具
  • 一分钟理解npm run dev 和 npm run serve
  • HTTP 协议请求头 If-Match、If-None-Match 和 ETag
  • DAY42 1049.最后一块石头的重量II + 494.目标和 + 474.一和零
  • uniapp原生插件之安卓华为统一扫码HMS Scan Kit
  • 数模国赛——多波束测线问题模型建立研究分析
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • vue+canvas实现横跨整个页面的动态的波浪线(贝塞尔曲线)
  • LeetCode算法题解|​ 669. 修剪二叉搜索树​、108. 将有序数组转换为二叉搜索树、​538. 把二叉搜索树转换为累加树​
  • 直播界很火的无线领夹麦克风快充方案 Type-C接口 PD快充+无线麦克风可同时进行
  • Jmeter 汉化中文语言
  • centos9 stream 下 rabbitmq高可用集群搭建及使用
  • 代码随想录算法训练营第10天|232. 用栈实现队列 225. 用队列实现栈
  • 线上Kafka集群如何调整消息存储时间
  • [迁移学习]DA-DETR基于信息融合的自适应检测模型
  • 【MATLAB】全网唯一的13种信号分解+FFT傅里叶频谱变换联合算法全家桶
  • Nginx安装与配置