C++ pthread,两个线程读取一个全局变量

Kel*_*Tan 8 c++ mutex pthreads

如果有两个线程只读取全局变量,是否有必要使用互斥锁来锁定和解锁全局变量?

Rei*_*ica 5

如果线程只读取变量并且没有人写入它(不是其中一个线程,而不是其他人),那么没有锁定就完全没问题.如果可能发生任何并发修改,那么每个人(包括纯读者)必须以某种方式同步 - 通过互斥锁,读/写锁或其他方式.


Mat*_* M. 5

通常,需要独占访问以防止看到不一致的状态。对于读取器线程,这意味着避免部分读取

这意味着什么 ?想象一下,您有一个存储在两个(原子)整数上的值,例如坐标。

int i = 3;
int j = 4;
Run Code Online (Sandbox Code Playgroud)

现在,我们将阅读ij在它们进行修改时,更准确地说,当Writer线程想要以对角线方式从 移动(3, 4)到 时(4, 5)

Reader     Writer
  |          |
  |        i = 4
  |          |
i = 4     <pause>
j = 4        |
  |        j = 5
  |          |
Run Code Online (Sandbox Code Playgroud)

这称为部分读取Reader线程获得了对象所在的信息,(4, 4)即使它从未存在过。我会让你想想如果这些坐标用于计算平面的轨迹会发生什么......

然而,避免部分读取相当容易:应该以原子方式查看突变。

  • 如果没有突变(在读取期间),那么您可以读取
  • 如果有突变,则需要互斥机制(例如读写器互斥)

因此,为了回答您的问题,如果唯一的访问是读访问,则不需要同步。但是如果您有时(甚至很少)修改读取的信息,那么您需要某种机制。


the*_*orn 2

如果他们只是在阅读,那么您不需要锁定。