I am aware of this question https://stackoverflow.com/questions/859690/do-i-need-a-lock-when-only-a-single-thread-writes-to-a-shared-variable, but I believe my concerns are very different.
我最近使用线程和 OpenGL 创建了一个 SDL 应用程序。我有一个线程在循环中运行,它不断更新我绘制到屏幕上的对象的状态。状态非常简单,它只是一个布尔数组(当数组值为 true 时,我绘制它,当它为 false 时,我不绘制)。
目前,我的任何变量都没有互斥锁,一切都工作正常。即使在一次绘制之间只更新了状态数组的一半,帧速率也远高于(或至少等于)更新速率,因此具有一半更新的状态是可以接受的。
现在,我最初开始在使用中断的嵌入式系统上研究与此类似的想法。每隔一段时间,就会触发一个中断,更新状态数组,然后继续执行。现在我在多核桌面上,并同时更新阵列,我想知道为什么没有发生任何不好的事情,因为从技术上讲我正在读取和写入相同的内存位置同时.
- 这只是偶然,还是有没有发生内存访问冲突的原因?
- 如果变量的状态在使用该值之前、期间或之后发生变化是可以接受的,那么我是否应该使用互斥锁?
感谢您的帮助。
编辑:附加信息 - 数组是动态创建的,但是当创建/删除它时,我确实使用互斥体(我认为访问已删除的内存不会被友好地看待:P)。
理论上,在没有同步的情况下访问内存是完全无效的(未定义的行为)。
实际上,只要满足以下条件,它就是适度安全的:
- 只有一个线程在写,其他线程都在读。
- 你不在乎读者是否直到稍后某个时间(可能是很久以后比实际写入的时间。
- 你不在乎读者是否看到无序的更改,即他们看到后来所做的一些更改,而没有看到先前所做的其他更改。
问题 2 和 3 在 x86 上不是问题,但在几乎所有其他实际多核/SMP 机器上都可能发生。您可以使用一些特定于机器的 asm(或编译器内在函数)来插入来缓解它们记忆障碍在适当的点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)