C11:mutex和lock_guard的使用.

2023-11-18

在C++11中,引入了有关线程的一系列库.且都在std命名空间内.下面演示一个使用线程的例子.非常的简单.引入了thread和mutex头文件.

#include <iostream>
#include <thread>
#include <mutex>
using namespace std;

int g_i = 0;
mutex g_mutex;
void c()
{
    for (int i = 0; i < 20; ++i)
    {
        g_mutex.lock();
        cout << std::this_thread::get_id() << "  " << g_i++ << endl;
        g_mutex.unlock();
    }
}

int main()
{
    thread t1(c);
    thread t2(c);

    if (t1.joinable())
        t1.join();
    if (t2.joinable())
        t2.join();

    system("pause");
    return 0;
}
//打印结果.
932  0
10340  1
932  2
10340  3
932  4

我们使用mutex互斥锁,来保证线程的安全性.但是这样是很麻烦的.我们需要手动的对锁进行操作.如果出现多个分支的情况,则需要多次书写unlock操作.

所以引入了lock_guard对象.它是管理锁的模板类.

#include <iostream>
#include <thread>
#include <mutex>
using namespace std;

int g_i = 0;
mutex g_mutex;
void c()
{
    for (int i = 0; i < 20; ++i)
    {
        lock_guard<mutex> lock(g_mutex);
        cout << std::this_thread::get_id() << "  " << g_i++ << endl;
    }
}

int main()
{
    thread t1(c);
    thread t2(c);

    if (t1.joinable())
        t1.join();
    if (t2.joinable())
        t2.join();

    system("pause");
    return 0;
}

//它被用作临时变量来使用,用g_mutex锁进行初始化,初始化的时候就是锁的lock操作的时候,那么什么时候unlock呢?就是在超出它的作用域之后析构时unlock.

//初始化时lock.
explicit lock_guard(_Mutex& _Mtx)
        : _MyMutex(_Mtx)
        {   // construct and lock
        _MyMutex.lock();
        }

    lock_guard(_Mutex& _Mtx, adopt_lock_t)
        : _MyMutex(_Mtx)
        {   // construct but don't lock
        }
//析构时unlock.
    ~lock_guard() _NOEXCEPT
        {   // unlock
        _MyMutex.unlock();
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C11:mutex和lock_guard的使用. 的相关文章

随机推荐

  • StandardScaler类中transform和fit_transform

    StandardScaler类中transform和fit transform方法里 fit transform X train 找出X train的均值和 标准差 并应用在X train上 对于X test 直接使用transform方法
  • 机器学习常用十大算法

    基本的机器学习算法 线性回归算法 Linear Regression 逻辑回归算法 Logistic Regression 朴素贝叶斯算法 Naive Bayes 最近邻居 k 近邻算法 K Nearest Neighbors KNN 支持
  • 中路对线发现正在攻防演练中投毒的红队大佬

    背景 2023年8月14日晚 墨菲安全实验室发布 首起针对国内金融企业的开源组件投毒攻击事件 NPM投毒事件分析文章 紧接着我们在8月17日监控到一个新的npm投毒组件包 hreport preview 该投毒组件用来下载木马文件的域名地址
  • 信息收集 (一)Google Hack & robots文件

    一 Google Hack 在渗透测试中 信息收集是尤为重要的一部分 甚至可以占到整个渗透的百分之六十至七十 可见掌握好信息收集的方法十分重要 那GoogleHacking作为常用且方便的信息收集搜索引擎工具 它是利用谷歌搜索强大 可以搜出
  • nvm的安装

    当项目启动时npm i报错时 提示版本问题时 是因为项目中使用node版本过低而本地node版本太高时 需要切换低版本node 此时需要安装nvm node版本控制器 来进行版本切换 1 首先必须卸载本地node js 在我的电脑搜索nod
  • Dubbo 接口异常处理逻辑

    API 接口中抛出的异常类型 有一系列的规则 代码在 ExceptionFilter 的 onResponse 中 1 如果是受检异常 非Runtime 就直接抛出 这是因为如果是受检异常 接口定义的 throws 中需要涵盖 调用端需要捕
  • SQL server 基本增删改查(带练习示例)

    目录 建表sql语句 需要自己插数据 一 增加数据 1 插入单条数据 2 插入多条数据 二 修改数据 1 修改单列 修改刘德华的密码为123456 2 修改多列 修改小红的性别为女 年龄为30 三 删除数据 1 删除用户编号为3的用户信息
  • Python基本数据类型(三)

    一 set的函数说明 集合 set 是一个无序不重复元素的序列 基本功能是进行成员关系测试和删除重复元素 可以使用大括号 或者 set 函数创建集合 注 创建一个空集合必须用set 而不是 因为 是用来创建一个空字典 在python中set
  • python Django web 框架 (二十)之ORM

    Django之模型层第一篇 单表操作 一 ORM简介 我们在使用Django框架开发web应用的过程中 不可避免地会涉及到数据的管理操作 如增 删 改 查 而一旦谈到数据的管理操作 就需要用到数据库管理软件 例如mysql oracle M
  • 拿什么拯救你? rm -r

    天雷滚滚 天雷滚滚 天雷滚滚 作为一个Linux程序员 你能碰到的最伤心的事情 莫过于 编译了一整天的工程 不小心被rm r掉了 错误的执行了rm r 把文件系统都删除了 在嵌入式板子和PC之间切换的时候 不小心删错了目标 不要说你没有遇到
  • C++之数组

    C 基础 3 数组 3 1 一维数组 3 1 1 一维数组定义方式 3 1 2 一维数组数组名 3 2 二维数组 3 2 1 二维数组定义方式 3 2 2 二维数组数组名 3 数组 3 1 一维数组 概述 数组就是一个集合 里面存放了相同类
  • 进程、线程、管程、纤程、协程概念以及区别

    进程 进程是指在操作系统中能独立运行并作为资源分配的基本单位 由一组机器指令 数据和堆栈等组成的能独立运行的活动实体 进程在运行是需要一定的资源 如CPU 存储空间和I O设备等 进程是资源分配的基本单位 进程的调度涉及到的内容比较多 存储
  • WARNING: Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connec

    python安装包错误 网络原因 直接改用阿里云镜像 然后再安装 pip config set global index url https mirrors aliyun com pypi simple 这就修改成功 接下来正常执行安装命令
  • docker 编辑容器内文件

    docker 编辑容器内文件 近期在学习docker 为编辑容器中文件 可以使用以下几种方法 特此记录 方法1 在容器中修改 使用vi命令编辑文件 注 如果vi命令没有 可以使用yum y install vim或者apt get inst
  • js-table2excel

    eslint disable let idTmr const getExplorer gt let explorer window navigator userAgent ie if explorer indexOf MSIE gt 0 r
  • 流程图中的实线_XMind如何在流程图中绘制实线箭头?XMind使用技巧

    如何利用xmind制作自己的思维导图 你好 建议你可以这样试试看 打开画图工具点击上方栏目 思维导图 在跳转专的页面点击 立即属体验 进入在线绘制界面 在画布的四周有很多的工具栏 这些在绘制的过程中都是可以使用的 首先 将中心主题进行确立
  • Java中StringBuffer类常用方法介绍

    StringBuffer类的介绍 StringBuffer是字符串缓存区 当new的时候是在堆内存创建了一个对象 底层是一个长度为16的 字符数组当调用添加的方法时 不会再重新创建对象 在不断向原缓冲区添加字符 查看字符串缓存区容量和长度
  • 快速傅氏变换之旅(一) 概念简介 3

    1 蝶形变换 普通的FFT算法称为基2的FFT算法 这种算法的核心是蝶形变换 长度为n 2 k1的变换共需要做 k1 n 2 次蝶形变换 如上图所示 若需变换数据表示为一个复数数组c 则每次蝶形变换有2个输入 c i c i s 两个输出
  • JS解密日记

    前言 JS混淆是通过改变JS代码的语法结构来使代码难以阅读和理解的技术 然而 请注意 混淆并不能真正保护您的代码 因为它仍然可以被解密和恢复其原始形式 直接上源代码 eval function p a c k e r e function
  • C11:mutex和lock_guard的使用.

    在C 11中 引入了有关线程的一系列库 且都在std命名空间内 下面演示一个使用线程的例子 非常的简单 引入了thread和mutex头文件 include