2013-10-13 44 views

回答

2

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

2

如果他们只是在阅读,那么就不需要锁定,但当情况并非如此,那么我认为互斥将确保阅读线程不会占用资源,而无需执行任何操作。

像这样: -

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

类似地,对于Thread2

在一个侧面说明: -

互斥通常用于防止多线程访问共享存储器或其他资源同时。另外要记住,它不会锁定任何东西

5

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

3

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

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

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)即使它从来没有。我就让你想,如果这些坐标被用来计算飞机的轨迹会发生什么......

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

  • 如果没有突变(在这段时间的读取),那么你可以只读取
  • 如果有突变,你需要一个互斥机制(如读/写互斥)

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

+0

与上述问题类似。例如,我有两个线程。每个线程调用一个对象的方法来获取它的属性,例如A-> getName()。在这种情况下,互斥是必要的吗? –

+0

@JohnSimpson:一个方法只不过是一个以'* this'作为第一个参数的朋友函数的语法糖,所以问题只是关于*函数做了什么?*如果方法只以只读方式访问对象方法,那么它是没问题的,所以如果方法是'const'或者函数通过const-pointer或const-reference接受对象,它应该没问题(当心没有考虑到多线程安全设计的mutable属性) –