首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QMutex需要读取变量

QMutex需要读取变量
EN

Stack Overflow用户
提问于 2013-05-27 12:44:57
回答 2查看 147关注 0票数 0

我通过公共可访问的成员变量命令我的线程,这些成员变量通常由一个指定的互斥体保护。

我的问题是:如果一个变量在写访问期间被互斥保护,那么它在读访问期间也应该受到保护,还是我可以简单地读取它?

示例:

线程检查是否应该做一些特殊的事情。

(doSpecial是用另一个线程编写的)

代码语言:javascript
复制
// some code
if (doSpecial) {
  // code
}
// some code

这个读取访问应该由互斥保护吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-27 13:00:26

是的,如果变量在一个线程上被修改,而在其他线程上被访问,那么所有访问都必须由互斥保护。如果没有该方法或其他同步方法,就不能保证修改是原子的(因此其他线程可能读取损坏的值),也不能保证其他线程将看到修改后的值(它可能保留在一个处理器的缓存中,永远不会传播到其他处理器)。

在C++11中,对于简单类型,可以考虑使用std::atomic而不是由互斥对象保护的非原子变量。

票数 2
EN

Stack Overflow用户

发布于 2013-05-27 14:03:53

我不确定,但写整数或单个布尔值并不是原子,这将是非常奇怪的。我相信写双(64位)可能也是原子的。

如果doSpecial是两个线程直接访问的布尔变量,则需要将其限定为“易失性”。这将防止编译器为其使用缓存。

如果没有,进行测试的函数( If (doSpecial) )可能会在处理器内部缓存中映射变量,而if-test可能永远不会看到值的变化。

使用互斥对象并不会阻止编译器对变量进行这样的优化。

最好的方法是通过一个函数访问该值:

代码语言:javascript
复制
if ( isSpecial() ) ...

setSpecial( bool ){ ... }

它允许您在这两个函数中添加互斥管理,如果它们处理多个布尔值的话。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16773515

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档