Я пытался изменить переменную lock
a Boolean
, когда обнаружил следующую ошибку:
'bool' не является ссылочным типом, как требуется оператором блокировки
Кажется, что в операторах lock
разрешены только ссылочные типы, но я не уверен, что понимаю почему.
Андреас заявляет в своем комментарии:
Когда объект [тип значения] передается из одного потока в другой, выполняется копия, поэтому потоки работают на 2 разных объекта, что безопасно.
Это правда? Означает ли это, что когда я делаю следующее, я фактически изменяю два разных x
в методах xToTrue
и xToFalse
?
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: Я знаю об этом вопросе Как правильно заблокировать тип значения. Мой вопрос не связан с тем, как, но почему.