我通过公共可访问的成员变量命令我的线程,这些成员变量通常由一个指定的互斥体保护。
我的问题是:如果一个变量在写访问期间被互斥保护,那么它在读访问期间也应该受到保护,还是我可以简单地读取它?
示例:
线程检查是否应该做一些特殊的事情。
(doSpecial是用另一个线程编写的)
// some code
if (doSpecial) {
// code
}
// some code这个读取访问应该由互斥保护吗?
发布于 2013-05-27 13:00:26
是的,如果变量在一个线程上被修改,而在其他线程上被访问,那么所有访问都必须由互斥保护。如果没有该方法或其他同步方法,就不能保证修改是原子的(因此其他线程可能读取损坏的值),也不能保证其他线程将看到修改后的值(它可能保留在一个处理器的缓存中,永远不会传播到其他处理器)。
在C++11中,对于简单类型,可以考虑使用std::atomic而不是由互斥对象保护的非原子变量。
发布于 2013-05-27 14:03:53
我不确定,但写整数或单个布尔值并不是原子,这将是非常奇怪的。我相信写双(64位)可能也是原子的。
如果doSpecial是两个线程直接访问的布尔变量,则需要将其限定为“易失性”。这将防止编译器为其使用缓存。
如果没有,进行测试的函数( If (doSpecial) )可能会在处理器内部缓存中映射变量,而if-test可能永远不会看到值的变化。
使用互斥对象并不会阻止编译器对变量进行这样的优化。
最好的方法是通过一个函数访问该值:
if ( isSpecial() ) ...
setSpecial( bool ){ ... }它允许您在这两个函数中添加互斥管理,如果它们处理多个布尔值的话。
https://stackoverflow.com/questions/16773515
复制相似问题