Volatile в C#
Без синхронизации один поток может долго видеть устаревшее значение поля. Volatile.Read и Volatile.Write задают порядок: запись флага становится видимой другим потокам, и чтение этого флага не обгоняет чтение данных, которые записали раньше. Полный lock для одного флага не обязателен.
Класс Volatile не заменяет lock, если нужно атомарно изменить несколько связанных полей. Для одиночного флага готовности его хватает. Крутиться в цикле, пока флаг не сменится, в настоящей программе обычно не стоит: поток зря занимает процессор.
Рабочий поток сначала запишет число, затем опубликует флаг ready. Главный поток крутится, пока флаг не станет true. После выхода из цикла он видит актуальную запись и печатает 42. Без такого порядка теоретически возможен вечный цикл или чтение нуля:
int payload = 0;
bool ready = false;
Thread worker = new(() =>
{
payload = 42;
Volatile.Write(ref ready, true);
});
worker.Start();
while (!Volatile.Read(ref ready)) { }
Console.WriteLine(payload); // выведет 42
В рабочем потоке запишите в поле число 15 и только потом опубликуйте флаг готовности. В главном потоке дождитесь этого флага в цикле и выведите число.