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

时间:2013-10-13 10:34:00

标签: c++ pthreads mutex

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

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:4)

通常,阻止人们看到不一致状态需要独占访问权限。对于读者线程,这意味着避免部分读取

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

int i = 3;
int j = 4;

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

Reader     Writer
  |          |
  |        i = 4
  |          |
i = 4     <pause>
j = 4        |
  |        j = 5
  |          |

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

避免部分读取然而相当容易:应该原子地看到突变。

  • 如果没有突变(读取的持续时间),那么你可以阅读
  • 如果有突变,则需要互斥机制(如读写器互斥)

因此,要回答您的问题,如果唯一的访问是读访问,则不需要同步。但是如果你有时(甚至不经常)修改读取的信息,那么你需要一些机制。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

如果他们只是阅读那么不需要锁定,但是当情况不是这样时,我认为互斥会确保阅读线程不会占用资源而无需做任何事情。

这样的事情: -

Thread1() {
Mutex_lock();
Process global_variable;
Unlock_mutex();
}

同样适用于Thread2

旁注: -

Mutex通常用于防止多个线程同时访问共享内存或其他资源。还要记住,它本身并没有锁定任何东西