c# メモリ モデルは、ロックを保持しているスレッドが、他のスレッドが以前に同じロックを保持していたときに実行されたすべての更新を確認できることを保証しますか?
私はC#の仕様を読んでいますが、これに関する詳細を見つけることができません。
c# メモリ モデルは、ロックを保持しているスレッドが、他のスレッドが以前に同じロックを保持していたときに実行されたすべての更新を確認できることを保証しますか?
私はC#の仕様を読んでいますが、これに関する詳細を見つけることができません。
直感的な説明に行きます:その保証が提供されなかった場合、あなたはロックを実装することができませんでした。
正式な説明に行きます:これはCLI仕様(Ecma 335)のI.12.6.5章でカバーされています:
ロックの取得(System.Threading.Monitor.Enterまたは同期メソッドの入力)は暗黙的に揮発性読み取り操作を実行し、ロックの解放(System.Threading.Monitor.Exitまたは同期メソッドの終了)は暗黙的に揮発性書き込み操作を実行します。 。
揮発性読み取りには「取得セマンティクス」があります。これは、CIL命令シーケンスの読み取り命令の後に発生するメモリへの参照の前に読み取りが発生することが保証されていることを意味します。揮発性書き込みには「リリースセマンティクス」があります。これは、CIL命令シーケンスの書き込み命令の前のメモリ参照の後に書き込みが発生することが保証されていることを意味します。
はい、一定の制限があります。詳細については、お探しのセクションは 3.10 です。
ロックは、ロックを必要とする他のスレッドを一時停止するだけです。これにより、1 つのスレッドのみが共有データの更新を実行することが保証されます。
ロックが解除されると、別のスレッドがデータを更新できるようになり、前のスレッドの更新が表示されます。