调用相同对象的多个线程同时起作用。它会引起问题吗?

时间:2011-09-03 15:37:47

标签: c# multithreading

假设我有以下C#类

class MyClass
{
    private int _i;
    private object _locker = new object();

    public void DoSomething()
    {
        var b = 2;

        // some work that depends on b being 2

        lock(_locker)
        {
            _i = 3;
        }

        // some more work

        b = -1;

        // some more work
    }
}

我用这种方式,

//Usage:

var myobject = new MyClass();
new Thread(new ThreadStart(() => myobject.DoSomething())).Start();
new Thread(new ThreadStart(() => myobject.DoSomething())).Start();

可以发生以下序列吗?

Thread 1 is halfway through its work.
Thread 2 just starts. Sets b = 2. 
Thread 1 sets b = -1. 
Thread 2 is confused because it expected b to be 2 but its -1.

重要的一点是b是一个局部变量。两个线程是否可以访问b的同一个实例?我理解,对于实例变量_i,这将会发生。因此lock构造了它。但我不确定是否需要锁定局部变量。

1 个答案:

答案 0 :(得分:11)

当调用者输入方法DoSomething()时,局部变量将被置于堆栈中。每个线程在一个单独的堆栈上运行,并将获得自己唯一的局部变量。

Wikipedia for thread local storage的这一部分也适用于C#线程:

  

换句话说,静态或全局变量中的数据通常是总是   位于相同的内存位置,由线程引用   同样的过程。然而,堆栈上的变量是线程的本地变量,   因为每个线程都有自己的堆栈,驻留在不同的内存中   位置。