在我的情况下是不是需要互斥锁[关闭]
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
成员作为读取的一部分发生更改.以上是关于在我的情况下是不是需要互斥锁[关闭]的主要内容,如果未能解决你的问题,请参考以下文章