私はMonitorがkernel-mode/kernel syncオブジェクトを使うようにすべての可能な条件のリストをコンパイルしたいと思います。.NETモニタが正確にカーネルモードに移行するのはいつですか?
同期ブロックはフィールドを参照するカーネルオブジェクトを持っていますので、lock
はいつかカーネルモードに移行することを控除しました。 Lock (Monitor) internal implementation in .NET
それが答えられるにはあまりにも多くの質問があり、唯一の有用な情報がOPは、単にlock
がいつかカーネルモードに行くことを示すことによって、彼自身の質問に答えていることである:
私の質問は異なります - 正確にlock
がカーネルモードに行くのを知りたいのですが、なぜそうでないのかはわかりません。
私は古いバージョンとの違いがあるかどうかについて、.NET 4と4.5を聞いて、より興味を持って
EDIT:リヒター帳から:「シンクブロックは、カーネルオブジェクトのフィールドが含まれています、所有スレッドのID、再帰カウント、および待機スレッド数です。
ありがとうございます。特にSSCLIのために - 私はこれが公に利用可能であったことを知りませんでした。 –
CLRソースの関連部分を私に指摘したコメントをありがとう。私は特に回転部分に興味があります:カーネルに行く前に最初にスピンしたときにMonitorと主張されています。そして私はそれがどのくらい正確に回転するか(反復の回数、...)に興味があります。あなたが記述したコードパスでスピンを見ることはできませんが、AwareLock :: ContEntryがAwareLock :: TryEnterによって呼び出されたスピンロジックを参照しています。これは、タイムアウトが使用されている場合にのみTryEnterに適用されるので、C#のロックキーワードを使用しているときには回転が使用されていないようです。私は正しい? –