ロックを割り当てますか
-
10-07-2019 - |
質問
C#でlockキーワードを使用すると割り当てられることを思い出せませんが、どこかを読みました。
ValueTypeをロックしようとすると、valuetypeがボックス化されることは知っていますが、他の状況はありますか?
編集::
- 誰もが答えているようです 値型の場合、私はすでにこれを知っています!
- また、ロックとは何か、 それらを深く使用する方法、 ベストプラクティスに関する一般的なアドバイスは いい-しかし役に立たない;)
- する必要があります XNAアプリを作成しているので知っている xboxでの展開用。 Xbox ガベージコレクターは本当に遅い- これは私が維持する必要があることを意味します 最小限の割り当て、できれば 存在しない(これにより、 実行中のコレクター)
解決
see syncブロックの内部的な割り当ては怠慢ですが(ただし、Essential.NET 'volume 1'から知っているIIRCの実装の詳細、またはC#を介したCLRであり、そのように扱う必要があります)、シンプルなあなたが提案しているように箱に入れる必要がない場合は発生しません-なぜlock(<!> lt; integer var <!> gt;)は許可されませんが、Monitor.Enter(<!> lt; integer var <!> gt;)は許可されますか?
他のヒント
使用することを考えていた場合:
lock(this)
インスタンスを探しているので、 クラスはそれをロックして、あなたを台無しにすることもできます。それがであるかどうか 問題は、ユーザーが何をするかによって異なります。同じ状況 あなたがしている場合は存在します:
lock(typeof(MyClass))
これを行いたくない場合は、静的またはインスタンスを簡単に割り当てることができます オブジェクト(つまり、オブジェクトmyLock = new object())、その後ロックします。
参照型と値型のロックに関しては、この SOの取得時にリソースをロックする質問... には答えがあります:
タイプによって異なります-a 参照型、はい、値の場合 タイプ番号これもあなたがすべき理由です 決して、決して値型をロックしない 値のタイプはボックス化され、 それをロックする後続の試行 値は実際にロックを取得します 別のオブジェクト。
lockステートメントの定義:
ステートメントのロック(C#リファレンス)
lockキーワードはステートメントをマークします クリティカルセクションとしてブロックする 相互排除ロックの取得 与えられたオブジェクトに対して、実行 ステートメント、そしてリリース ロック。
この C#のロックキーワードに関するSO質問が役立つ場合があります。また、なぜlock()が許可されていませんが、Monitor.Enter()は許可されていますか?
コンパイラの仕様では、動作を定義していますそのようなロックの:
のコンパイル時タイプ ロック文の表現は 参照型または<!> gt;タイプ パラメータ(<!>#167; 25.1.1)として知られている 参照タイプ。コンパイル時です のコンパイル時タイプのエラー 値型を示す式。