如果有两个线程刚刚读取全局变量,是否需要使用互斥锁来锁定和解锁全局变量?C++ pthread,两个线程读取全局变量
8
A
回答
2
如果他们是只是阅读,那么你不需要锁定。
2
如果他们只是在阅读,那么就不需要锁定,但当情况并非如此,那么我认为互斥将确保阅读线程不会占用资源,而无需执行任何操作。
像这样: -
Thread1() {
Mutex_lock();
Process global_variable;
Unlock_mutex();
}
类似地,对于Thread2
在一个侧面说明: -
互斥通常用于防止多线程访问共享存储器或其他资源同时。另外要记住,它不会锁定任何东西
5
如果线程只读取变量和没有人正在写入它(不是线程之一,而不是其他人),那么你是完全没有锁。如果可能发生任何并发修改,那么每个人(包括纯粹的读者)都必须以某种方式进行同步 - 通过互斥锁,读/写锁或其他方式进行同步。
3
一般来说,需要独家访问防止看到不一致的状态。对于读者线程,这意味着避免部分读取。
这是什么意思?想象一下,你有一个存储在两个(原子)整数上的值,例如坐标。
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)
即使它从来没有。我就让你想,如果这些坐标被用来计算飞机的轨迹会发生什么......
避免部分读取但是是相当容易:突变应该看到原子。
- 如果没有突变(在这段时间的读取),那么你可以只读取
- 如果有突变,你需要一个互斥机制(如读/写互斥)
因此,要回答你的问题,如果只有访问是读取访问,则不需要同步。但是如果你有时(甚至很少)修改读取的信息,那么你需要一些机制。
相关问题
- 1. 同时从2个线程读取全局变量
- 2. Objective-C,全局变量和线程
- 3. C++多线程安全局部变量?
- 4. 从多个线程读取全局值
- 5. 全局变量和线程
- 6. Python全局变量线程
- 7. C - 使用pthread在两个线程之间重现全局变量的同步问题
- 8. 理解为什么多线程无法读取全局变量
- 9. 从线程读取全局变量并从另一个线程写入该变量
- 10. Python线程全局变量问题
- 11. C#变量线程安全
- 12. 一个线程读取和另一个写入volatile变量 - 线程安全?
- 13. 多个线程读取一个变量
- 14. 一个程序有两个线程,一个线程增加全局变量,其他线程减少相同的变量,这个变量总是正确的吗?
- 15. 从Python中的一个线程读取值:队列或全局变量?
- 16. 装配 - 线程安全局部变量
- 17. 函数不读取全局变量
- 18. 从全局变量读取和写入
- 19. 在actionscript 2.0中读取全局变量
- 20. C++全局变量
- 21. 全局变量,C
- 22. C#全局变量
- 23. C++:全局变量
- 24. 多线程定期更新全局变量,同时第三个线程等待读取
- 25. 的Python线程和全局变量
- 26. java线程全局变量的同步
- 27. 并行线程和全局变量
- 28. 全局变量跨线程不更新
- 29. 线程中的全局变量
- 30. 在线程中设置全局变量
与上述问题类似。例如,我有两个线程。每个线程调用一个对象的方法来获取它的属性,例如A-> getName()。在这种情况下,互斥是必要的吗? –
@JohnSimpson:一个方法只不过是一个以'* this'作为第一个参数的朋友函数的语法糖,所以问题只是关于*函数做了什么?*如果方法只以只读方式访问对象方法,那么它是没问题的,所以如果方法是'const'或者函数通过const-pointer或const-reference接受对象,它应该没问题(当心没有考虑到多线程安全设计的mutable属性) –