locka will がフィールドからの値を強制的にリロードすることは一般的に受け入れられています (私は信じています!)。内でのみアクセスされるフィールド自体は である必要はありませlockんvolatile。
(私がすでに間違っている場合は、言ってください!)
良いコメントがここで提起され、コードが a を行う場合に同じことが当てはまるかどうかを疑問視しWait()ていPulse()ます。
またはもっと簡単に: フィールドはvolatile、Wait()?
リフレクタを見て、(と同じ )である をWait呼び出します。ObjWaitmanaged internalcallEnter
問題のシナリオは次のとおりです。
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