在我的情况下是不是需要互斥锁[关闭]

Posted

技术标签:

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

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

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

【问题讨论】:

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

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

但是如果:

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

那么你确实需要同步。

【讨论】:

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

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

【讨论】:

... 并且没有其他线程写入变量,而两个线程从中读取...并且只要对象内部没有 mutable 成员作为读取的一部分发生更改.

以上是关于在我的情况下是不是需要互斥锁[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

c++ - 互斥锁或群 fcntl.h 锁定只写操作

锁定未锁定的互斥体的效率如何?互斥锁的成本是多少?

是否可以在 Linux/UNIX 上的多处理情况下使用互斥锁?

使用条件变量优于互斥锁的优点

为什么我们想在具有互斥锁的情况下使函数递归?

C# 互斥量处理