Вы на самом деле публикуете два вопроса.
Это потокобезопасно?
Ну, очевидно, это не так, другой поток может изменить значение X, пока первый поток входит впереключатель.Поскольку блокировки нет, а переменная не является энергозависимой, вы переключитесь на неправильное значение.
Вы когда-нибудь попадете в состояние по умолчанию для переключателя?
Теоретически вы можете, как обновление64 бита - это не атомарная операция, и, таким образом, вы можете теоретически перейти в середину назначения и получить смешанный результат для x, как вы указали.Статистически это случается не часто, но в конечном итоге это случится.
Но сам коммутатор является поточно-безопасным , то, что не является поточно-безопасным, читается и записывает поверх 64-битных переменных (в 32-битной ОС).
Представьте, что вместо коммутатора (x) у вас есть следующий код:
long myLocal = x;
switch(myLocal)
{
}
теперь коммутатор выполняется над локальной переменной, и, таким образом, он полностьюпоточно.Проблема, конечно, заключается в myLocal = x
read и его конфликте с другими заданиями.