【问题标题】:Is mutex required in my case [closed]在我的情况下是否需要互斥锁[关闭]
【发布时间】:2014-11-06 23:09:52
【问题描述】:

我有两个线程共享一个变量,但它们都没有写入该变量。我确实明白,当两个线程动态读取或写入变量时,您确实需要一个互斥锁。但是,由于我只是从任一线程读取共享变量,我还需要使用互斥锁吗?

附:我的是一个 C++ 程序,我正在使用 std::mutex。

【问题讨论】:

  • 你不需要一个互斥锁(或任何其他同步)只是为了阅读。
  • 我没有投反对票,但我猜他/她希望您提供示例代码,以便我们提供更好的答案。例如 int 变量不需要锁,但 long long 需要

标签: c++ multithreading synchronization mutex


【解决方案1】:

如果保证变量不会被改变,那么读取就不需要互斥体。

但是如果:

  1. 有可能在您的线程尝试读取变量的同时(由任何线程)写入变量
  2. 而且,读/写不是原子的

那么你确实需要同步。

【讨论】:

  • 一个变量不会处于半写状态...它受到硬件级别的内存访问的保护
  • 取决于变量的类型。记住这是 C++。
  • 不管是什么语言,都受硬件保护
  • 什么时候硬件保护operator =()不受任何影响?
  • Steve,实际上没有硬件保证任何特定大小的值都不会受到竞争情况的影响。实际上,在开发 C++11 时,在仅支持 4 字节写入且没有更小的机器上执行 1 字节写入的情况下,对此进行了特别有趣的讨论。 C99 和 C++11 有一个称为 atomic_int_t 的整数大小,这很特别,因为它确实有这样的硬件保证(并且在永远无法为任何大小的整数提供这种保证的平台上不可用)
【解决方案2】:

只要它们只是从变量中读取,并且可以通过一次存储/读取字操作来写入/读取变量,那么您就不会。

【讨论】:

  • ... 并且没有其他线程写入变量,而两个线程从中读取...并且只要对象内部没有 mutable 成员作为读取的一部分发生更改.
猜你喜欢
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2011-12-01
  • 2011-09-06
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
相关资源
最近更新 更多