lock
a will がフィールドからの値を強制的にリロードすることは一般的に受け入れられています (私は信じています!)。内でのみアクセスされるフィールド自体は である必要はありませlock
んvolatile
。
(私がすでに間違っている場合は、言ってください!)
良いコメントがここで提起され、コードが a を行う場合に同じことが当てはまるかどうかを疑問視しWait()
ていPulse()
ます。
またはもっと簡単に: フィールドはvolatile
、Wait()
?
リフレクタを見て、(と同じ )である をWait
呼び出します。ObjWait
managed internalcall
Enter
問題のシナリオは次のとおりです。
bool closing;
public bool TryDequeue(out T value) {
lock (queue) { // arbitrary lock-object (a private readonly ref-type)
while (queue.Count == 0) {
if (closing) { // <==== (2) access field here
value = default(T);
return false;
}
Monitor.Wait(queue); // <==== (1) waits here
}
...blah do something with the head of the queue
}
}
明らかに、単にそれを作成することも、パルスが発生するたびvolatile
に終了して再入力するようにこれを移動することもできますが、どちらかが必要かどうかを知りたいと思っています.Monitor