C++ 多线程锁

目录

    • 1. mutex
    • 2. lock_guard
    • 3. unique_lock 是 lock_guard 的升级加强版
    • 4. condition_variable
    • 5. 调用

#include “thread”
#include “mutex”
#include “iostream”

//! std::thread
//! jion 阻塞式, .join()后面的代码等待线程结束
//! detach 非阻塞式, 后面代码继续执行

1. mutex

类型说明
std::mutex最基本的 Mutex 类。
std::recursive_mutex递归 Mutex 类
std::time_mutex定时 Mutex 类
std::recursive_timed_mutex定时递归 Mutex 类。
std::mutex mtx;
int i = 0;
void add1()
{mtx.lock();for(int n = 0; n < 20; ++n)std::cout<<"add1 i = "<<++i<<std::endl;mtx.unlock();
}void add2()
{mtx.lock();for(int n = 0; n < 20; ++n)std::cout<<"add2 i = "<<++i<<std::endl;mtx.unlock();
}

2. lock_guard

//! 创建即加锁,作用域结束自动析构并解锁,无需手工解锁
//! 不能中途解锁,必须等作用域结束才解锁
//! 不能复制

void add3()
{std::this_thread::sleep_for(std::chrono::milliseconds(10));std::lock_guard<std::mutex> lockg(mtx);for(int n = 0; n < 20; ++n){std::cout<<"add3 i = "<<++i<<std::endl;}
}void add4()
{std::this_thread::sleep_for(std::chrono::milliseconds(10));std::lock_guard<std::mutex> lockg(mtx);for(int n = 0; n < 20; ++n){std::cout<<"add4 i = "<<++i<<std::endl;}
}

3. unique_lock 是 lock_guard 的升级加强版

//! 创建时可以不锁定(通过指定第二个参数为std::defer_lock),而在需要时再锁定
//! 可以随时加锁解锁
//! 作用域规则同 lock_grard,析构时自动释放锁
//! 不可复制,可移动
//! 条件变量需要该类型的锁作为参数(此时必须使用unique_lock)
//! std::adopt_lock (必须先加锁)
//! std::try_to_lock
//! std::defer_lock (必须手动加锁)

void add5()
{//! std::adopt_lock//mtx.lock();//std::unique_lock<std::mutex> ulock(mtx, std::adopt_lock);// 先加锁//! std::defer_lock//std::unique_lock<std::mutex> ulock(mtx, std::defer_lock);// 后手动加锁//ulock.lock();//!std::unique_lock<std::mutex> ulock(mtx);	//自动加锁for(int n = 0; n < 20; ++n)std::cout<<"add5 i = "<<++i<<std::endl;
}void add6()
{//! std::adopt_lock//mtx.lock();//std::unique_lock<std::mutex> ulock(mtx, std::adopt_lock);//! std::defer_lock//std::unique_lock<std::mutex> ulock(mtx, std::defer_lock);//ulock.lock();//!std::unique_lock<std::mutex> ulock(mtx);for(int n = 0; n < 20; ++n)std::cout<<"add6 i = "<<++i<<std::endl;
}

4. condition_variable

std::condition_variable cv;
bool wait = false;
void printf1(int n)
{for (int i = 0; i < n; ++i) {std::unique_lock<std::mutex> ulock(mtx);if(wait) cv.wait(ulock);std::cout<<"printf1    " << i <<std::endl;wait = true;cv.notify_one();}
}void printf2(int n)
{for (int i = 0; i < n; ++i) {std::unique_lock<std::mutex> ulock(mtx);if(!wait) cv.wait(ulock);std::cout<<"printf2    " << i+10 <<std::endl;wait = false;cv.notify_one();}
}

5. 调用

//! 1.mutexstd::thread td(add1);std::thread td2(add2);td.join();td2.join();
//! 2. lock_guardstd::thread td3(add3);std::thread td4(add4);td3.detach();td4.detach();
//! 3. unique_lock
std::thread td5(add5);
std::thread td6(add6);
td5.detach();
td6.detach();
//! 4. condition_variable + unique_lock
std::thread td7(printf1, 10);
std::thread td8(printf2, 10);
td7.detach();
td8.detach();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/168056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一、TIDB基础

TIDB整个逻辑架构跟MYSQL类似&#xff0c;如下&#xff1a; TIDB集群&#xff1a;相当于MYSQL的数据库服务器&#xff0c;区别是MYSQL数据库服务器为单进程的&#xff0c;TIDB集群为分布式多进程的。 数据库&#xff1a;同MYSQL数据库&#xff0c;数据库属于集群&#xff0c;…

SSL握手失败的解决方案

一、SSL握手失败的原因&#xff1a; 1&#xff0c;证书过期&#xff1a;SSL证书有一个有效期限&#xff0c;如果证书过期&#xff0c;就会导致SSL握手失败。 2&#xff0c;证书不被信任&#xff1a;如果网站的SSL证书不被浏览器或操作系统信任&#xff0c;也会导致SSL握手失败…

线性代数的艺术

推荐一本日本网友Kenji Hiranabe写的《线性代数的艺术》。这本书是基于MIT大牛Gilbert Strang教授的《每个人的线性代数》制作的。 虽然《线性代数的艺术》这本书仅仅只有12页的内容&#xff0c;就把线性代数的重点全画完了&#xff0c;清晰明了。 《线性代数的艺术》PDF版本&…

mysql 变量和配置详解

MySQL 中还有一些特殊的全局变量&#xff0c;如 log_bin、tmpdir、version、datadir&#xff0c;在 MySQL 服务实例运行期间它们的值不能动态修改&#xff0c;也就是不能使用 SET 命令进行重新设置&#xff0c;这种变量称为静态变量。数据库管理员可以使用前面提到的修改源代码…

nodejs 将word转为pdf office-to-pdf

jspdf用于html转pdf。需借助html2canvas遍历页面中的dom节点,渲染成canvas image&#xff0c;再用jspdf把图片转为pdf。office-to-pdf 用于word转pdf。依赖于libreOffice&#xff0c;需提前安装 mac安装libreOffice 1.首先需要jdk8,并配置环境变量 2.再就是需要安装libreOf…

【Golang】使用泛型对数组进行去重

背景&#xff1a; 要求写一个方法&#xff0c;返回去重后的数组。数组的类型可能是int64&#xff0c;也可能是string&#xff0c;或是其他类型。 如果区分类型的话&#xff0c;每增加一个新的类型都需要重新写一个方法。 示例代码&#xff1a; //对int64数组进行去重 func DeD…

ErphpdownV16.21插件 安装教程和插件下载

ErphpdownV16.21插件下载_新版本 上传插件并解压 登入后台插件管理启动ErphpdownV16.21插件即可 启动后设置即可使用此版本为学习版插件 功能介绍&#xff1a; Erphpdown会员推广下载专业版 经过完美测试运行于wordpress 3.x-6.x版本。后续会增加更多实用的功能。已针对此插件…

Vue中学习笔记-数据代理

文章目录 前文提要数据代理的概念MVVM模型和Vue中的数据代理M&#xff0c;模型V&#xff0c;视图VM&#xff0c;视图模型 前文提要 本人仅做个人学习记录&#xff0c;如有错误&#xff0c;请多包涵 数据代理的概念 使用一个对象代理对另一个对象中属性的操作。 MVVM模型和Vu…

Windows IDEA Python开发环境安装+爬虫示例

文章目录 Python下载安装开发工具IDEA包管理安装pip基本用法从 requirements.txt 安装依赖 项目示例部署在 Linux 上安装Python在 Linux 上创建虚拟环境&#xff1a;安装依赖&#xff1a;运行你的爬虫 Python下载安装 Python 安装包下载地址&#xff1a;https://www.python.or…

Oracle登录认证方式详解

文章目录 一、简介二、OS认证三、口令认证四、remote_login_passwordfile 详解 一、简介 在数据库管理中&#xff0c;登录认证是确保数据库安全性的重要环节。Oracle数据库提供 了两种认证方式&#xff0c;一种是“操作系统认证”&#xff0c;一种是“口令文件认证&#xff0c…

智安网络|如何最大限度地提高企业网络安全水平

在当今数字化时代&#xff0c;企业面临着日益复杂和智能化的网络威胁。为了保护企业的机密信息和客户数据&#xff0c;漏洞扫描成为了一个至关重要的安全措施。然而&#xff0c;对于企业来说&#xff0c;他们最关心的是什么问题呢&#xff1f; 一、漏洞的发现和修复 在网络安全…

路径规划之Best-First Search算法

系列文章目录 路径规划之Dijkstra算法 路径规划之Best-First Search算法 路径规划之Best-First Search算法 系列文章目录前言一、Best-First Search算法1.1 起源1.2 过程 三、简单使用 前言 Best-First Search算法和Dijkstra算法类似&#xff0c;都属于BFS的扩展或改进 一、…

Nginx 服务器 SSL 证书安装部署

操作场景 本文档以证书名称 menglinfeng.top 为例。 Nginx 版本以 nginx/1.18.0 为例。 当前服务器的操作系统为 CentOS 7&#xff0c;由于操作系统的版本不同&#xff0c;详细操作步骤略有区别。 安装 SSL 证书前&#xff0c;请您在 Nginx 服务器上开启 “443” 端口&#xf…

基于官方YOLOv4开发构建目标检测模型超详细实战教程【以自建缺陷检测数据集为例】

本文是关于基于YOLOv4开发构建目标检测模型的超详细实战教程&#xff0c;超详细实战教程相关的博文在前文有相应的系列&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a;《基于yolov7开发实践实例分割模型超详细教程》 《YOLOv7基于自己的数据集从零构建模型完整训练、…

springboot(ssm超市货品信息管理系统 超市购物系统Java(codeLW)

springboot(ssm超市货品信息管理系统 超市购物系统Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&am…

Linux技能篇-非交互式修改密码

今天的文章没有格式&#xff0c;简单分享一个小技能&#xff0c;就是标题所说–非交互式修改密码。 一、普通方式修改用户密码 最普通的修改密码的命令就是passwd命令 [rootlocalhost ~]# passwd root Changing password for user root. New password: Retype new password:…

一文彻底看懂Python切片,Python切片理解与操作

1.什么是切片 切片是Python中一种用于操作序列类型(如列表、字符串和元组)的方法。它通过指定起始索引和结束索引来截取出序列的一部分,形成一个新的序列。切片是访问特定范围内的元素,就是一个Area。 说个笑话:切片不是切片,而是切片,但是又是切片。大家理解下呢(末…

高防cdn防护原理是什么,是否可以防护服务器吗

随着互联网业务的迅速发展&#xff0c;网络安全问题日益凸显。在这样的背景下&#xff0c;高防CDN作为一种有效的网络安全解决方案&#xff0c;受到了越来越多的关注。那么高防CDN的防护原理是什么呢?接下来就跟小德一起深入了解下吧! 1. 高防CDN的基本概念 我们要明确什么是…

【云原生 Prometheus篇】Prometheus的动态服务发现机制

自动发现 一、Prometheus服务发现 理论部分1.1 Prometheus数据采集配置1.2 基于文件的服务发现1.3 基于consul的服务发现1.4 基于 Kubernetes API 的服务发现1.4.1 概念1.4.2 部分配置参数1.4.3 配置模板 二、实例一&#xff1a;部署基于文件的服务发现2.1 创建用于服务发现的文…

Spring事务底层原理(待完善)

EnableTransactionManagement 我们经常使用EnableTransactionManagement开启事务, 这个注解导入一个类,Import(TransactionManagementConfigurationSelector.class), 会在spring容器增加两个bean, AutoProxyRegistrar和ProxyTransactionManagementConfiguration. AutoProxyRe…