std::unique_lock 或 std::lock_guard

2023-11-25

我有两个用例。

答:我想同步两个线程对队列的访问。

B. 我想同步两个线程对队列的访问并使用条件变量,因为其中一个线程将等待另一个线程将内容存储到队列中。

对于用例 A,我看到代码示例使用std::lock_guard<>。对于用例 B,我看到代码示例使用std::unique_lock<>.

两者之间有什么区别?在哪种用例中我应该使用哪一种?


区别在于您可以锁定和解锁std::unique_lock. std::lock_guard只会在建造时锁定一次,并在破坏时解锁。

所以对于用例 B 你肯定需要一个std::unique_lock为条件变量。对于情况 A,这取决于您是否需要重新锁定防护装置。

std::unique_lock具有其他功能,允许它例如:在不立即锁定互斥体的情况下构建,但构建 RAII 包装器(请参阅here).

std::lock_guard还提供了方便的 RAII 包装器,但无法安全地锁定多个互斥体。当您需要有限范围的包装器时可以使用它,例如:成员函数:

class MyClass{
    std::mutex my_mutex;
    void member_foo() {
        std::lock_guard<mutex_type> lock(this->my_mutex);            
        /*
         block of code which needs mutual exclusion (e.g. open the same 
         file in multiple threads).
        */

        //mutex is automatically released when lock goes out of scope
    }           
};

默认情况下通过 chmike 澄清问题std::lock_guard and std::unique_lock是相同的。 所以在上面的情况下,你可以替换std::lock_guard with std::unique_lock。然而,std::unique_lock可能会有更多的开销。

请注意,现在(自 C++17 起)人们应该使用std::scoped_lock代替std::lock_guard.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

std::unique_lock 或 std::lock_guard? 的相关文章

  • 通过另一个列表更新列表(linq)

    我有类 Data 的对象列表 如下所示 class Data int code string name DateTime date update 我还有另一个课程列表 例如 class RefCodes int old code int n
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 类中是否可以有虚拟类声明?

    我正在为个人项目中框架的各个组件设置一个接口 我突然想到了一些我认为可能对接口有用的东西 我的问题是这是否可能 class a public virtual class test 0 class b public a public clas
  • 如何调试在发布版本中优化的变量

    我用的是VS2010 我的调试版本工作正常 但我的发布版本不断崩溃 因此 在发布版本模式下 我右键单击该项目 选择 调试 然后选择 启动新实例 此时我看到我声明的一个数组 int ma 4 1 2 8 4 永远不会被初始化 关于可能发生的事
  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • 关闭整数的最右边设置位

    我只需要关闭最右边的设置位即可 我的方法是找到最右边位的位置 然后离开该位 我编写这段代码是为了这样做 int POS int n int p 0 while n if n 2 0 p else break n n 2 return p i
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • 是否可以在Linux上将C转换为asm而不链接libc?

    测试平台为Linux 32位 但也欢迎 Windows 32 位上的某些解决方案 这是一个c代码片段 int a 0 printf d n a 如果我使用 gcc 生成汇编代码 gcc S test c 然后我会得到 movl 0 28 e
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • 在 mvc4 中创建通用 mvc 视图

    我以前也提过类似的问题 没有得到答案 如何创建一个通用的 mvc4 视图 该视图可以显示传递给它的模型列表或单个模型 模型可以是个人 组织或团体 无论传递给它的是什么 如果您正在寻找类似的东西 model MyViewModel
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • java中使用多线程调用同一类的不同方法

    我有一个类 如下所示 具有三种方法 public class MyRunnable implements Runnable Override public void run what code need to write here to c
  • 当 Verb="runas" 时设置 ProcessStartInfo.EnvironmentVariables

    我正在开发一个 C 应用程序 我需要创建变量并将其传递给新进程 我正在使用ProcessStartInfo EnvironmentVariables 新进程必须提升运行 因此我使用 Verb runas var startInfo new
  • 在二进制数据文件的标头中放入什么

    我有一个模拟 可以读取我们创建的大型二进制数据文件 10 到 100 GB 出于速度原因 我们使用二进制 这些文件依赖于系统 是从我们运行的每个系统上的文本文件转换而来的 所以我不关心可移植性 当前的文件是 POD 结构的许多实例 使用 f
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe

随机推荐

  • 带有自定义按钮的 Outlook 插件“主页”选项卡

    嘿 我正在尝试在默认情况下创建一个按钮HomeOutlook 2010 中的选项卡 问题是 在 VS2013 中 我添加了一个功能区 视觉 并添加了带有按钮的组 但它不断将其添加到选项卡插件 tab 我需要设置什么才能使自定义组 按钮显示在
  • 如何在Python中将二进制文件读取为十六进制?

    我想读取一个包含数据的文件 以十六进制格式编码 01ff0aa121221aff110120 etc 文件包含 gt 100 000 个这样的字节 有些超过 1 000 000 它们来自 DNA 测序 我尝试了以下代码 以及其他类似的代码
  • PHP中的INI文件到多维数组

    我有下一个 INI 文件 a b c 1 a b d e 2 我正在使用 parse ini file 解析该文件 它返回 array a b c gt 1 a b d e gt 2 但我想创建一个多维数组 我的输出应该是 array a
  • C++ 是否在 std::set、std::map 等的恒定时间内执行 begin/end/rbegin/rend ?

    对于诸如 std set 和 std map 之类的数据类型 其中查找发生在对数时间内 是否需要实现来维护开始和结束迭代器 访问开始和结束是否意味着可能在对数时间内发生查找 我一直假设开始和结束总是在恒定时间内发生 但是我在 Josutti
  • Gradle错误,创建目录失败

    今天在使用 roboelectric 和 junit 启动测试类时遇到了这样的问题 Information Gradle Executing tasks app assembleDebug app assembleDebugUnitTest
  • 如何仅使用 DOM 对象获取 leaflet.js 实例?

    我现在正在构建一个自定义 Knockout js 绑定来处理多边形的绘制 在这种情况下 Knockout API 仅向我提供对 DOM 对象的引用 以访问我需要更新的任何内容 然而 leaflet js 的设计似乎希望用户在其实现中存储地图
  • Plotly 停用 x 轴排序

    我想绘制一个条形图 x 轴上是顾问的 ID 范围在 1000 到 2000 之间 每个顾问都有特定数量的客户 y 轴 现在我想绘制一个条形图 但是 情节性地将顾问 ID 升序排序并将它们解释为整数 但事实并非如此 它们的顺序应该像我精心给出
  • 不带链接的 Typescript blob 文件名

    如何在打字稿中设置blob的文件名 对于 IE 我可以轻松设置文件名 但对于 Chrome 这看起来不可能 基本上我需要类似的东西这个解决方案但用打字稿 downloadFile data any var blob new Blob dat
  • MongoDB:如何查询字段为空或未设置的记录?

    我有一个Email文档有一个sent at日期字段 sent at Date 1336776254000 If this Email尚未发送 则sent at字段要么为空 要么不存在 我需要获取所有已发送 未发送的计数Emails 我一直在
  • MySQL ORDER BY IN()

    我有一个 PHP 数组 其中包含多个 ID 这些号码已经被订购 现在我想通过 IN 方法获取结果 以获取所有 ID 但是 这些 ID 应该像 IN 方法中那样排序 例如 IN 4 7 3 8 9 应该给出如下结果 4 Article 4 7
  • 如何设置 VSCode 在 C# 和 C++ 中键入时将大括号放在新行上?

    我希望 VS Code 在 C 和 C 中将花括号放在新行上 How it works now How it should look 尝试了 C FixFormat 扩展 但只有在按下 CTRL K F 后它才起作用 但我希望 VS Cod
  • 致命异常:java.lang.NoClassDefFoundError:rt

    Fatal Exception java lang NoClassDefFoundError rt at rs SourceFile 17 at android support v7 widget RecyclerView onSaveIn
  • iOS 7 联系电话空格不是空格[重复]

    这个问题在这里已经有答案了 在我的应用程序中 我尝试检索联系人号码列表并尝试对它们进行操作 我意识到每当我添加新联系人 更新到 iOS 7 后 新联系人格式都会发生变化 因为新添加的号码中有空格 使用普通的替换方法不会删除空格 这些真的是空
  • 来自 hbase/filesystem 的 hadoop namenode 连接中的 EOF 异常是什么意思?

    这既是关于java EOF异常的一般问题 也是与jar互操作性相关的Hadoop的EOF异常 关于任一主题的评论和答案都是可以接受的 背景 我注意到一些讨论神秘异常的线程 该异常最终是由 readInt 方法引起的 此异常似乎具有一些独立于
  • sp_send_dbmail 附加在数据库中存储为 varbinary 的文件

    我有一个由两部分组成的问题 涉及使用 sp send dbmail 将查询结果作为附件发送 问题一 仅会打开基本的 txt 文件 任何其他格式 例如 pdf 或 jpg 都会损坏 问题2 当尝试发送多个附件时 我收到一个文件 其中所有文件名
  • 在没有命名空间但在需要命名空间的类中反序列化 XML

    复制 序列化对象时省略所有 xml 命名空间 不一样 我想以另一种方式 反序列化 我有一个 C 类 如下所示 System CodeDom Compiler GeneratedCodeAttribute xsd 2 0 50727 42 S
  • Angular2在路由器出口之外获取路由器参数

    我有一个仪表板应用程序 它由一个树视图组件 列出了各种内容节点 和一个仪表板编辑组件组成 该组件根据选择的树分支呈现一些可编辑的内容 例如树是这样的 Football Premier League Arsenal Chelsea etc C
  • 如何通过单击可执行 r 文件从 rmd 脚本编织 pdf?

    Synopsis 我想通过单击文件 图标从 rmd 脚本生成 pdf 文件 这样我的同事就不会因为先打开 RStudio 而精疲力竭 问题 当我看到this在 R bloggers 上 并让它工作起来 我认为我正在接近从脚本编写到共享我的工
  • 如何在 Nodejs Express 中提供图像

    我有这个代码 var express require express var http require http var app express var server http createServer app app use expres
  • std::unique_lock 或 std::lock_guard

    我有两个用例 答 我想同步两个线程对队列的访问 B 我想同步两个线程对队列的访问并使用条件变量 因为其中一个线程将等待另一个线程将内容存储到队列中 对于用例 A 我看到代码示例使用std lock guard lt gt 对于用例 B 我看