9

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

4

4 回答 4

7

如果线程只读取变量而没有人写入它(不是线程之一,不是其他人),那么没有锁你就很好了。如果可能发生任何并发修改,那么每个人(包括纯读者)都必须以某种方式同步——通过互斥锁、读/写锁或其他方式。

于 2013-10-13T11:10:47.727 回答
5

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

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

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)即使它从未存在。我会让你想想如果这些坐标用于计算飞机的轨迹会发生什么......

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

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

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

于 2013-10-13T11:21:56.940 回答
2

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

于 2013-10-13T10:39:06.763 回答
2

如果他们只是在阅读,那么就不需要锁,但如果不是这种情况,那么我认为互斥锁将确保阅读线程在无事可做时不会吃掉资源。

像这样的东西: -

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

同样对于Thread2

附带说明:-

互斥锁一般用于防止多个线程同时访问共享内存或其他资源。还要记住它本身不会锁定任何东西

于 2013-10-13T10:40:45.717 回答