Несколько потоков, вызывающих одни и те же объекты одновременно. Может ли это вызвать проблемы?

Предположим, у меня есть следующий класс 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 ответов


локальная переменная будет помещена в стек, когда вызывающий объект войдет в метод DoSomething(). Каждый поток работает на отдельном стеке и получит свою собственную уникальную локальную переменную.

эта Википедия для локального хранилища потоков применяется и к потоковой обработке C#:

другими словами, данные в статической или глобальной переменной обычно всегда находится в том же месте памяти, когда упомянутые потоки тот же процесс. Переменная однако в стеке локальны для потоков, поскольку каждый поток имеет свой собственный стек, находящийся в другой памяти местоположение.