【发布时间】:2011-11-25 09:58:37
【问题描述】:
当我遇到以下错误时,我试图 lock Boolean 变量:
'bool' 不是 lock 语句所要求的引用类型
lock 语句中似乎只允许引用类型,但我不确定我理解为什么。
安德烈亚斯在他的comment:
当 [a value type] 对象从一个线程传递到另一个线程时,会生成一个副本,因此线程最终会处理 2 个不同的对象,这是安全的。
这是真的吗?这是否意味着当我执行以下操作时,我实际上是在修改xToTrue 和xToFalse 方法中的两个不同的x?
public static class Program {
public static Boolean x = false;
[STAThread]
static void Main(string[] args) {
var t = new Thread(() => xToTrue());
t.Start();
// ...
xToFalse();
}
private static void xToTrue() {
Program.x = true;
}
private static void xToFalse() {
Program.x = false;
}
}
(仅此代码在其状态下显然无用,仅用于示例)
P.S:我在How to properly lock a value type 上知道这个问题。我的问题与如何无关,而与为什么有关。
【问题讨论】:
-
您的程序没有在它使用共享副本的线程之间传递 x。但是它仍然不是线程安全的,因为您没有在锁的范围内访问 x 并且 x 没有被声明为 volatile。我觉得另一个问题来了:“为什么这个例子中的 x 需要是 volatile 的?”
-
@MartinBrown:我知道,并且在我的 real 代码中,我在专用对象上使用了锁(正如我在问题中提到的,它与 为什么而不是如何)。至于
volatile,则是not needed when locking properly。
标签: c# multithreading locking reference