如果有两个线程只读取全局变量,是否需要使用互斥锁来锁定和解锁全局变量?
答案 0 :(得分:5)
如果线程只读取变量并且 nobody 正在写入它(不是其中一个线程,而不是其他人),那么没有锁定就完全没问题。如果可能发生任何并发修改,那么每个人(包括纯读者)必须以某种方式同步 - 通过互斥锁,读/写锁或其他方式。
答案 1 :(得分:4)
通常,阻止人们看到不一致状态需要独占访问权限。对于读者线程,这意味着避免部分读取。
这是什么意思?想象一下,你有一个存储在两个(原子)整数上的值,例如坐标。
int i = 3;
int j = 4;
现在,我们将在进行修改时阅读i
和j
,更确切地说,当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通常用于防止多个线程同时访问共享内存或其他资源。还要记住,它本身并没有锁定任何东西