У мене є змінна, яку я використовую для представлення стану. Його можна читати та записувати з декількох потоків.
Я використовую Interlocked.Exchange
і, Interlocked.CompareExchange
щоб змінити це. Однак я читаю це з декількох потоків.
Я знаю, що це volatile
може бути використано для переконання, що змінна не кешована локально, а завжди читає безпосередньо з пам'яті.
Однак якщо я встановлюю змінну на volatile, тоді вона генерує попередження про використання volatile і передачу за допомогою ref до методів Interlocked.
Я хочу переконатися, що кожен потік читає останнє значення змінної, а не якусь кешовану версію, але я не можу використовувати volatile.
Є, Interlocked.Read
але це для 64-розрядних типів, і він недоступний на компактній платформі. У документації до нього сказано, що він не потрібен для 32-бітових типів, оскільки вони вже виконуються за одну операцію.
В Інтернеті є заяви, що вам не потрібні нестабільні, якщо ви використовуєте взаємоблоковані методи для всього свого доступу. Однак ви не можете прочитати 32-бітну змінну за допомогою методів Interlocked, тому ви не можете використовувати методи Interlocked для всього свого доступу.
Чи є якийсь спосіб здійснити безпечне читання та запис моєї змінної без використання блокування?
lock
і я не можу знайти посилання на те, що він дає такі гарантії.