Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
⊗csSpCcVo 370 of 509 menu
◀ ▶

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 и только потом опубликуйте флаг готовности. В главном потоке дождитесь этого флага в цикле и выведите число.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить