繁体   English   中英

如果仍然需要互斥锁才能正常工作,为什么要使用 std::atomic

[英]why use std::atomic if it still requires a mutex to work properly

阅读std::condition_variable的文本我遇到了这句话:

即使共享变量是原子的,也必须在互斥锁下进行修改,才能将修改正确发布到等待线程。

我的问题是这样的:

如果不是“与 POD 一起工作的无锁代码”,原子有什么用?

更新

看起来我的问题有些混乱:(

引用文本中的“共享变量”与“条件变量”不同。 请参阅同一页面中的此引用:

...直到另一个线程同时修改共享变量(条件),并通知condition_variable

请不要回答“ 为什么我们需要使用带有条件变量的互斥锁”或“ 条件等待如何工作”,而是提供有关互斥锁的使用如何“正确发布”对等待线程的原子修改的信息,即是否像++counter;这样的表达式++counter; 不是if(counter == 0)这样的测试)需要在互斥锁下完成吗?

条件等待的语义需要使用互斥锁。

这是因为在测试条件的线程上存在潜在的竞争条件。 当该线程检查是否等待时,会发生以下情况:

  1. 获取排他锁
  2. 进行测试
  3. 任何一个:

    a) 释放锁并等待下一个信号

    b) 保持锁定并继续

因为第 1 步获取锁,所以整个事情是原子的,前提是所有其他方都正确使用互斥锁。

但是当被修改的变量是原子的时候呢?

即使共享变量是原子的,也必须在互斥锁下进行修改,才能将修改正确发布到等待线程。

嗯,这就是原因。 如果线程 B 出现并修改互斥锁之外的原子,则步骤 2 和 3 不再是原子的。 本质上,线程 B 可以在步骤 2 发生后立即修改该值。 那么线程 A 可能会在步骤 3 中做出错误的决定。

如果 [条件变量] 仍然需要互斥体才能正常工作,为什么要使用 std::atomic

没有理由使用原子条件变量。

原子有什么用

即使原子对条件变量没有用处,它们仍然可以用于其他用例。 原子的典型用例是实现无锁队列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM