【发布时间】:2016-11-17 09:50:28
【问题描述】:
我在 Linux 中使用 C++ 编程,并且正在使用 pthreads 库。我正在使用互斥锁来保护一些共享变量,但我不确定在这种特定情况下是否有必要使用互斥锁。
我有 3 个线程。共享变量是一个字符串(全局变量)。
Thread1 改变了它的值,然后 thread2 和 thread3 读取它的值并存储在另一个字符串中。
在这种情况下,字符串的值只被一个线程修改。两个线程并发读取时是否还需要使用互斥锁来保护共享变量?
【问题讨论】:
-
只要有至少一个线程在修改对象,您就需要一个互斥锁。唯一不需要它的情况是每个人都在阅读。
-
但是线程 2 和 3 只有在 Thread1 已经修改了它的值时才读取字符串的值。
-
如果您可以确保线程 1 在其他任何人尝试读取字符串之前完成了对字符串的修改,那么您将处于每个人都读取的情况:不需要互斥锁。
-
完美!非常感谢!
-
在标准的范围内,是的,会有:至少有一次写入的不同步的同时访问被称为竞争条件,并触发未定义的行为。一些平台能够对某些简单数据类型执行无锁原子操作,但您不能再依赖该标准。为了解决这个问题,您可以使用
std::atomic<bool>,它将转换为您平台的最佳操作,如果没有其他可用的,则降级为互斥体。
标签: c++ multithreading mutex