Несколько потоков, вызывающих одни и те же объекты одновременно. Может ли это вызвать проблемы?
Предположим, у меня есть следующий класс 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#:
другими словами, данные в статической или глобальной переменной обычно всегда находится в том же месте памяти, когда упомянутые потоки тот же процесс. Переменная однако в стеке локальны для потоков, поскольку каждый поток имеет свой собственный стек, находящийся в другой памяти местоположение.