【cpp】并发多线程 Unique

1. unique_lock 何时锁定资源。

unique_lock lock1 时候,还没有锁住资源。 实际是后面,显式的出发: 比如, lock.lock, 或 std::lock(lk1,lk2), 或者条件变量CV.wait(mtx, []{!re})。

#include <iostream>
#include <mutex>
#include <thread>
#include "my_utils.h"struct Box
{explicit Box(int num) : num_things{num} {}int num_things;std::mutex m;
};void transfer(Box& from, Box& to, int num)
{// don't actually take the locks yet, e.g. conditional variable imp.// no lockingstd::unique_lock lock1{from.m, std::defer_lock};std::unique_lock lock2{to.m, std::defer_lock};SLEEP_FOR_500_MS();SLEEP_FOR_500_MS();// lock both unique_locks without deadlockstd::lock(lock1, lock2);from.num_things -= num;to.num_things += num;// “from.m” and “to.m” mutexes unlocked in unique_lock dtors
}int main()
{Box acc1{100};Box acc2{50};std::thread t1{transfer, std::ref(acc1), std::ref(acc2), 10};std::thread t2{transfer, std::ref(acc2), std::ref(acc1), 5};acc1.num_things=199;std::cout<<"main thrd starts wait for notifier!"<<acc1.num_things<<" no locking yet\n";t1.join();t2.join();std::cout << "acc1: " << acc1.num_things << "\n""acc2: " << acc2.num_things << '\n';
}

运行结果,如下: 可见资源在 unique_lock 声明时候,还没有被锁定独享。

2. unique_lock 使用,常常是配合,触发锁定条件的,可以是时间timelockable,也可以是条件 lockable。

以下,一condional ariable 结合 unique_lock,为例:

#include <condition_variable>
#include <iostream>
#include <mutex>
#include <string>
#include <thread>#include "my_utils.h"std::mutex m;
std::condition_variable cv;
std::string data;
bool ready = false;
bool processed = false;void worker_thread()
{// wait until main() sends datastd::unique_lock lk(m);cv.wait(lk, []{ return ready; });// after the wait, we own the lockstd::cout << "Worker thread is processing data\n";data += " after processing";// send data back to main()processed = true;std::cout << "Worker thread signals data processing completed\n";// manual unlocking is done before notifying, to avoid waking up// the waiting thread only to block again (see notify_one for details)//“惊群效应”(thundering herd problem),即多个线程被唤醒,但只有一个线程能够立即获取到锁,其他线程会再次进入等待状态lk.unlock(); //手动解锁允许你更灵活地控制这些操作何时发生, first unlock manue, then notify.cv.notify_one();
}int main()
{std::thread worker(worker_thread);data = "Example data";// send data to the worker thread{std::lock_guard lk(m);ready = true;std::cout << "main() signals data ready for processing\n";}cv.notify_one();// wait for the worker{std::unique_lock lk(m);cv.wait(lk, []{ return processed; });}std::cout << "Back in main(), data = " << data << '\n';worker.join();
}

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

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

相关文章

LVS + Keepalived 高可用群集

一、准备环境 主keepalived&#xff1a;172.168.1.11 lvs 备keepalived&#xff1a;172.168.1.12 lvs web1&#xff1a;172.168.1.13 web2&#xff1a;172.168.1.14 vip&#xff1a;172.168.1.100 客户机访问 关闭防火墙 二、配置 主keepalived 服务器 1. 安装…

[嵌入式系统-78]:RT-Thread:线程管理的基本原理与应用

目录 一、RTT线程的特点 二、RTT线程机制 2.1 线程的属性与线程控制块详解 2.2 线程的调度 2.3 线程的切换 2.5 系统线程 三、线程的调度机制 3.1 线程创建与删除 1、线程控制块 2、线程栈 3、入口函数 4、线程的创建方式 &#xff08;1&#xff09;静态线程初始化函…

【手势操作-复习前一天的内容-预习今天的内容 Objective-C语言】

一、昨天呢,我们学习的是这个,事件 1.事件这一块儿呢,iOS事件,分为三大类, 1)触摸事件 2)加速计事件 3)远程控制事件 2.这个里边呢,我们主要学习的是这个触摸事件,触摸事件里边,就是Touch,touchesBegan:方法里边,有一个touches参数,它是set类型的, 3.Set,…

nginx与php的通信方式

Nginx 和 PHP 之间的通信主要通过 FastCGI 协议进行&#xff0c;而FastCGI协议支持两种通信方式&#xff1a;Unix域套接字&#xff08;Unix Socket&#xff09;和TCP/IP网络套接字。下面是这两种通信方式的主要区别&#xff1a; Unix域套接字&#xff08;Unix Socket&#xff…

甲辰年四月初七思悟

甲辰年四月初七思悟 意懒青云天&#xff0c;情贪山水间。​ 为志凡尘炼&#xff0c;行路交际变。​ 日程分秒年&#xff0c;四时轮回现。 ​忧苦缘分面&#xff0c;嗔痴欲求践。

Redis:分布式系统

文章目录 认识RedisRedis和MySQLRedis的场景Redis的设计 分布式单机架构应用数据分离架构应用服务集群架构 认识Redis 在开始Redis学习前&#xff0c;要先认识一下Redis Redis的设计&#xff0c;是想要把它当做是一个数据库&#xff0c;一个缓存&#xff0c;或者说是一个消息…

C语言 | Leetcode C语言题解之第87题扰乱字符串

题目&#xff1a; 题解&#xff1a; struct HashTable {int key;int val;UT_hash_handle hh; };void modifyHashTable(struct HashTable** hashTable, int x, int inc) {struct HashTable* tmp;HASH_FIND_INT(*hashTable, &x, tmp);if (tmp NULL) {tmp malloc(sizeof(st…

Nginx - location中的匹配规则和动态Proxy

文章目录 官网location 规则详解动态Proxy使用多个 if 指令指定不同的 proxy_pass根据参数选择不同的 proxy_pass 官网 https://nginx.org/en/docs/http/ngx_http_core_module.html#location location 规则详解 Nginx的location指令工作原理如下&#xff1a; 位置匹配&#…

vs2019 c++ 对左值引用取地址得到的是谁的地址?

&#xff08;1&#xff09; 测试一下&#xff1a; 对左值引用取地址&#xff0c;返回的地址是其引用的变量的地址&#xff0c;而非自身的地址。 &#xff08;2&#xff09; 用反汇编看一下&#xff0c;为了代码容易看懂&#xff0c;改一下源代码&#xff0c;不使用 cout 这个复…

【格式控制】(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 从键盘输入一批数值&#xff0c;要求保留3位小数&#xff0c;在输出时上下行小数点对齐。 源码 #include <iostream>using namespace std;int main(void) {double a, b, c;cout << "请输入三个实数&#xff0c;中间用空格…

iOS 数据库升级

使用FMDB结合FMDBMigrationManager&#xff08;一个三方库&#xff09;的方式 1、首先自定义一个sql语句的类 #import#import"FMDBMigrationManager.h" interfaceMigration:NSObject (instancetype)initWithName:(NSString*)name andVersion:(uint64_t)version a…

阿里云OSS配置跨域及域名访问

1、配置跨域 进入对象存储OSS–>OSS存储桶–>数据安全–>跨域设置–>创建规则 2、配置跨域 Etag x-oss-request-id3、配置结果如下 4、数据源配置 切换到数据管理–>静态页面 配置根页面 保存结果如下 5、配置域名访问 绑定域名 添加txt记录 验证绑定 …

Unity 滚动视图(ScrollRect)使某个元素在可视范围内(滚动到某个元素)

在使用UGUI制作滚动视图的过程中&#xff0c;可能会遇到需求说&#xff0c;要定位到其中的某个元素&#xff0c;把它显示在Viewport可视范围内&#xff0c;这要怎么做呢&#xff1f;话不多说&#xff0c;上代码&#xff1a; namespace ZetanStudio.Extension {public static c…

git仓库使用

git仓库是会限制空间大小限制的 git网络库的容量限制_github仓库大小限制-CSDN博客 git是用于管理github的工具 电脑左下角搜索git打开GitBash.exe 进入到要下载到本地的目录 下载到本地的文件不要更改&#xff01; 如果要使用请务必把文件复制到别的空间去再在这个别的空间…

spring_Mybatis模板

maven依赖&#xff1a; <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.20</version></dependency><dependency><groupId>mysql…

论文阅读记录--关于水文系统的传递函数

文章目录 J-schuite的文章,地下水系统的响应的功率谱分析--传递函数1. 什么是冲激响应函数与传递函数?2. 地下水流系统中传递函数的求解3. J-schuite文章中传递函数的复现J-schuite的文章,地下水系统的响应的功率谱分析–传递函数 1. 什么是冲激响应函数与传递函数? 在信号…

记录:卡尔曼滤波推导

参考&#xff1a;古月居-卡尔曼滤波 一、高斯分布&#xff08;Gaussian Distribution&#xff09; 一维高斯分布&#xff1a;随机变量 X X X服从数学期望 μ \mu μ、方差 σ 2 \sigma^2 σ2的正态分布&#xff0c;概率密度函数为 p ( x ) p(x) p(x)。 X ∼ N ( μ , σ 2 )…

前言:为什么学习鸿蒙设备开发

HarmonyOS 是什么&#xff1f;众所周知&#xff0c;HarmonyOS 鸿蒙操作系统是由华为研发的一款面向未来、面向全场景的分布式操作系统&#xff0c;它旨在为各种设备提供统一的操作系统解决方案&#xff0c;从智能手机、平板电脑到智能穿戴设备、智能家居、汽车等各类终端设备都…

Go语言数值类型教程

Go语言提供了丰富的数值类型&#xff0c;包括整数类型、浮点类型和复数类型。每种类型都有其特定的用途和存储范围。下面将详细介绍这些类型&#xff0c;并附带示例代码。 原文链接&#xff1a; Go语言数值类型教程 - 红客网-网络安全与渗透技术 1. 整数类型 原文链接&#xf…

字符画生成网站 ascii字符画

_____ / ___/__ ___ / /__/ _ \/ _ \ \___/ .__/ .__//_/ /_/ font推荐&#xff1a;1.Slant 2.Small 3.Small slant https://patorjk.com/software/taag/#pdisplay&fSmall%20Slant&tCpp https://www.kammerl.de/ascii/AsciiSignature.php https://asciia…