如果有两个线程只读取一个全局变量,是否需要使用互斥锁来锁定和解锁全局变量?
问问题
8671 次
4 回答
7
如果线程只读取变量而没有人写入它(不是线程之一,不是其他人),那么没有锁你就很好了。如果可能发生任何并发修改,那么每个人(包括纯读者)都必须以某种方式同步——通过互斥锁、读/写锁或其他方式。
于 2013-10-13T11:10:47.727 回答
5
通常,需要独占访问以防止看到不一致的状态。对于读者线程,这意味着避免部分读取。
这意味着什么 ?想象一下,您有一个存储在两个(原子)整数上的值,例如坐标。
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)
即使它从未存在。我会让你想想如果这些坐标用于计算飞机的轨迹会发生什么......
然而,避免部分读取相当容易:应该以原子方式查看突变。
- 如果没有突变(在读取期间),那么您可以读取
- 如果有突变,则需要互斥机制(例如读写器互斥锁)
因此,要回答您的问题,如果唯一的访问是读取访问,则不需要同步。但是,如果您有时(甚至不经常)修改读取的信息,那么您需要一些机制。
于 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 回答