线程安全性和成员变量[英] Thread safety and member variables

问题描述

大家好,

我想知道线程安全和成员变量.如果我有
这样一个类:

类富 {
私人浮动 m_floater = 0.0;
公共无效栏(){
m_floater = true;
}
}

变量 m_floater 线程安全吗?如果我写了一个测试程序并且
在 VS2005 中运行它,m_floater 变量最终出现在本地窗口中
在我的调试器中(对于每个线程),所以看起来它是线程
安全的.我假设如果我让我的成员变量这会改变
存储在托管堆上的东西?(即每个线程
有自己的堆栈,但只有一个堆可用于存储).

感谢您帮助解决这个看似简单的问题.
HC

推荐答案

编辑:
m_floater = true 应该是 m_floater = 17.7

2008 年 8 月 13 日星期三 16:49:41 -0700,<他*************@googlemail.com 写道:
我想知道线程安全和成员变量.如果我有
这样一个类:

类富 {
私人浮动 m_floater = 0.0;
公共无效栏(){
m_floater = true;
}
}

变量 m_floater 线程安全吗?
一点都不.那段代码让你觉得会是什么?
如果我写了一个测试程序并且
在 VS2005 中运行它,m_floater 变量最终出现在本地窗口中
在我的调试器中(对于每个线程),所以看起来它是线程
安全的.
首先,您不会在"本地人"中看到成员字段
窗口,但作为隐式"this"的后代除外.多变的.这不是
一个局部变量,但是"this"变量是.二、如果一切顺利
使成员字段"线程安全";是为了它,嗯...一个成员字段,
那么默认情况下所有类都是线程安全的.那绝对不是
是的.
我假设如果我让我的成员变量这会改变
存储在托管堆上的东西?(即每个线程
有自己的堆栈,但只有一个堆可用于存储).
你的班级"foo"是一个引用类型,所以总是从
堆.所以任何实例字段也都存储在堆上,类
是(他们毕竟是班级的一部分).你不能让你的"会员"
变量转换为存储在托管堆上的东西".已经
是.

确实,局部变量本质上是线程安全的,
只能从它们所在的方法所在的线程访问
声明正在执行.但这与里面的东西无关
类,因为您不能将类存储在局部变量中.你只能
将 _reference_ 存储到局部变量中的类中,并且该引用
将始终引用存储在堆中的数据.因此,没有某种
同步,类的任何实例成员都不是线程安全的(任何
静态成员也不是,但这是一个单独的问题 :) ).

最后,以免你开始认为这是一个仅限班级的事情,而
那么值类型(即结构)必须是线程安全的,那就是
对于仅在内部声明为局部变量的结构为 true
方法.用作类成员类型的结构仍然
最终与班级的其他成员一起在堆上分配,所以
不会继承线程安全声明为局部变量的结构
会的.

皮特

彼得·杜尼霍写道:
2008 年 8 月 13 日星期三 16:49:41 -0700,<He******************@googlemail.com 写道:
>我想知道线程安全和成员变量.如果我有
这样一个类:

class foo {
private float m_floater = 0.0;
public void bar(){
m_floater = true;
}
}

变量m_floater线程安全吗?

一点都不.那段代码如何让你认为它会是?
数据本身永远不是线程安全的.数据结合
它们的使用方式可以是线程安全的,也可以不是线程安全的.

其实上面的代码是线程安全的.

也是没用的,所以收益没那么大.

阿恩

本文地址:https://www.itbaoku.cn/post/1050818.html