【发布时间】:2010-05-06 17:33:49
【问题描述】:
在 C# 中,每个线程都有自己的堆栈空间。
如果是这样,为什么下面的代码不是线程安全的? (在这篇文章中声明此代码是线程安全的:Locking in C#
class Foo
{
private int count = 0;
public void TrySomething()
{
count++;
}
}
由于 count 是一个 int(堆栈变量),所以这个值肯定会被隔离到单独的线程,在它自己的堆栈上,因此是线程安全的?
我可能在这里遗漏了一些东西,但如果不是线程的基于堆栈的变量,我不明白线程本地存储中的实际内容是什么?
另外,本地声明的变量呢:
class Foo
{
public void TrySomething(object myObj)
{
var localVariable = new object();
localVariable = myObj;
}
}
这里对局部变量有什么影响?它仍然是基于堆的吗?它是线程安全的吗?
【问题讨论】:
-
而这类问题正是为什么当人们声称“结构存储在堆栈上”而没有对其进行限定时,我会跳上去……
-
抱歉,您能解释一下吗?从下面所说的,类中包含的任何变量实际上都存储在堆上,而基于堆栈的结构中的仅基于堆栈的成员变量实际上是在堆栈上。这是真的吗?
标签: c# multithreading