首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >std::lock()等价于boost::shared_mutex?

std::lock()等价于boost::shared_mutex?
EN

Stack Overflow用户
提问于 2014-01-13 18:18:07
回答 1查看 997关注 0票数 2

我有许多对象,每个对象都与一个boost::shared_mutex相关联(我需要共享/唯一的锁功能)。

在某些情况下,在代码中,我需要同时获得多个对象的唯一所有权。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for (FileMetaData* entry : smd->fileSet) {
    entry->fileMutex.lock();
}

// some critical work

for (FileMetaData* entry : smd->fileSet) {
    entry->fileMutex.unlock();
}

当不同的线程试图获得不同的锁集时,这样做会导致死锁。

我发现std::lock ()适合我的用例。但是,boost::shared_mutex是否有等价性呢?

编辑:

关于有序锁定模式,它不完全适用于我的情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
T1 lock (C,D,E)
T2 wants to lock (B,D), but can only obtain the lock for B
T1 spawns T3 which works on (B,C), it stuck when obtaining the lock for B

所以问题是,当T1生成T3时,B需要额外的锁,这就破坏了有序的锁定模式。我认为,如果当D不能锁定时,T2不为B保存锁,那么这个问题就可以解决,实质上是std::lock所做的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-13 18:59:48

您可以使用std::lock (或等效的boost::lock,统称为“锁函数”)执行共享所有权锁定和独占锁定,这取决于您传入的要锁定的内容--任何Lockable都可以工作。例如,如果您想在独占模式下锁定两个std::mutex/boost::mutexA, Bboost::shared_mutex SM,只需将这三个锁传递给std::lock

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
std::lock(A, B, SM);

如果您想在共享所有权模式下锁定SM,您可以为它创建一个未锁定的boost::shared_lock,并将其传递给锁定函数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
boost::shared_lock<boost::shared_mutex> bsl{SM, boost::defer_lock};
std::lock(A, B, bsl);

在一个与您的问题风格偏好无关的注意事项上--我更喜欢构造RAII锁以传递到std::lock,这样我就不会搞砸解锁,所以我实际上会写:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
auto alk = boost::make_unique_lock(A, std::defer_lock);
auto blk = boost::make_unique_lock(B, std::defer_lock);
// boost::make_shared_lock(), where are you?!?
boost::shared_lock<boost::shared_mutex> bsl{SM, boost::defer_lock};
std::lock(alk, blk, bsl);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21104958

复制
相关文章
junit方法按顺序执行
选定版本,直接加注解
IT云清
2021/12/06
1.3K0
junit方法按顺序执行
sql按顺序去重
参考博客: https://blog.csdn.net/qtvb1987/article/details/42081585
周杰伦本人
2022/10/25
8450
sql按顺序去重
数组按指定顺序排序
数组排序可以直接使用 sort() 方法,可以对数组按规律排序。 但如果指定一个没有规律的顺序进行排序呢? 同样可以使用  sort() 方法: const data = [   { name: '张三', code: 'zs' },   { name: '王五', code: 'ww' },   { name: '赵七', code: 'zq' }, ]; data.sort((star, next) => {   const sortList = ['zq', 'zs', 'ww']   return 
德顺
2022/06/12
2.7K0
实现线程按顺序输出ABC
线程按顺序输出ABC 实现描述:建立三个线程A、B、C,分别按照顺序输出十次ABC 首先建立一个方法,按照条件进行输出 class PrintABC{ private int index=0; public synchronized void print(int n) { // TODO Auto-generated method stub try { while(index!=n) { wait(); } if(index==0) { System.out.
呆呆
2021/10/06
7810
hive-行转列按顺序合并
目录 一、背景 二、实现 1.建表ddl 2.示例数据 3.按顺序合并 4.按顺序合并结果 5.可以看到最后一条最长的才是我们需要的数据 6.结果 ---- ---- 一、背景 想实现行转列按顺序合并,但是impala不支持,故用hive实现 二、实现 1.建表ddl create table a( id bigint comment '主键', type bigint comment '分类', start_time bigint comment '开始时间,时间戳', end_time big
chimchim
2022/11/13
2.1K0
hive-行转列按顺序合并
java | 如何让线程按顺序执行?
本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。使用的方法如下:
JavaFish
2019/10/16
6.6K0
JavaScript 将对象数组按字母顺序排序
1.if条件语句 + sort() 2.localeCompare() + sort() 3.Collator() + sort()
唐志远
2023/08/01
2610
JavaScript 将对象数组按字母顺序排序
让线程按顺序执行 8 种方法
本文使用了8种方法实现在多线程中让线程按顺序运行的方法,涉及到多线程中许多常用的方法,不止为了知道如何让线程按顺序运行,更是让读者对多线程的使用有更深刻的了解。使用的方法如下:
业余草
2019/09/18
2K0
让线程按顺序执行 8 种方法
JavaScript 将对象数组按字母顺序排序
Chrome、IE、Edge、Firefox、Safari、Opera 等 都支持 sort() 方法。
唐志远
2023/07/26
6330
JavaScript 将对象数组按字母顺序排序
LeetCode 1389. 按既定顺序创建目标数组
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/create-target-array-in-the-given-order 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
Michael阿明
2022/11/26
4220
LeetCode 1389. 按既定顺序创建目标数组
让线程按顺序执行8种方法
1.早上;2.测试人员、产品经理、开发人员陆续的来公司上班;3.产品经理规划新需求;4.开发人员开发新需求功能;5.测试人员测试新功能。
java架构师
2019/04/09
1K0
RTL设计- 多时钟域按顺序复位释放
当外部输入的复位信号只有一个,但是时钟域有多个时,使用每个时钟搭建自己的复位同步器即可,如下所示。
FPGA开源工作室
2021/05/31
1.5K0
RTL设计- 多时钟域按顺序复位释放
LeetCode 1389. 按既定顺序创建目标数组
目标数组 target 最初为空。 按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组中的下标 index[i] 处插入值 nums[i] 。 重复上一步,直到在 nums 和 index 中都没有要读取的元素。 请你返回目标数组。
freesan44
2020/06/16
4620
LeetCode 1389. 按既定顺序创建目标数组
1389. 按既定顺序创建目标数组: https://leetcode-cn.com/problems/create-target-array-in-the-given-order/
村雨遥
2020/04/07
6420
GoogleMaps api for javascript demo 动态按顺序加载marker
@{ } <!DOCTYPE html> <html lang="zh"> <head> <meta name="viewport" content="initi
阿新
2018/04/12
8040
Python按顺序读取文件夹中文件
涉及到文件操作,我们有时候会读取一个文件夹中的所有的文件。这些文件可能是文件名完全混乱的,也可能是完全格式化的(如1.png,2.png...)。下面介绍Python中的几种按顺序(假如有)读取文件夹中文件的方法。
狼啸风云
2020/08/27
9.9K0
Python按顺序读取文件夹中文件
按之字形顺序打印二叉树
请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。
MickyInvQ
2021/12/07
4570
python 按顺序读文件夹下面的文件
方法一: import os path="/home/test/" #待读取的文件夹 path_list=os.listdir(path) path_list.sort() #对读取的路径进行排
狼啸风云
2020/08/10
2.5K0
python 按顺序读文件夹下面的文件
按之字形顺序打印二叉树
两个栈来实现; 定义一个放奇数层得栈,一个方偶数层得栈,和一个层奇偶标志, 遍历两个栈,每次消灭一个栈中得数据,添加在list中添加一层得数据 需要注意得是结合栈得先进后出性质,当我们遍历到奇数层时候,我们要从左到右得添加数据到栈二.同理偶数相反.
名字是乱打的
2022/12/13
2810
如何实现 DAX 按指定顺序拼接字符串
如果你正在学习 DAX,那么这又是一个非常好的案例可以帮助你理解 DAX 很多妙处。
BI佐罗
2021/12/01
1.5K0
如何实现 DAX 按指定顺序拼接字符串

相似问题

如何按顺序安排svg动画的时间?

13

按顺序安排任务

22

安排多个R脚本按顺序运行

10

Spyder如何安排python脚本按顺序运行

10

使用动画css按顺序动画元素

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文