Думаю, я немного понял, что именно делают Volatile.Write
и Volatile.Read
, но я видел несколько примеров, где Volatile.Write
используется в начале метода, как в CLR через C# книгу, где Джеффри показывает, как реализовать простую блокировку вращения с помощью Interlocked
. Вот код:
struct SimpleSpinLock {
private int _resourceInUse; // 0 = false, 1 = true
public void Enter() {
while (true) {
if (Interlocked.Exchange(ref _resourceInUse, 1) == 0) return;
}
}
public void Leave() {
Volatile.Write(ref _resourceInUse, 0); // Why is it here??
}
}
Вот как предполагается использовать класс:
class SomeResource {
private SimpleSpinLock _s1 = new SimpleSpinLock();
public void AccessResource() {
_s1.Enter();
// Some code that only one thread at a time can get in..
_s1.Leave();
}
}
Итак, как я знаю, Volatile.Write
используется для гарантии того, что инструкции, которые находятся над ним будет выполнен точно перед Volatile.Write
. Но в методе Leave
инструкция только одна и зачем тут использовать Volatile.Write
? Наверное, я совершенно неправильно понимаю вещи, поэтому был бы признателен, если бы кто-нибудь мог привести меня на правильный путь.