この記事は機械翻訳のミラー記事です。元の記事にジャンプするにはこちらをクリックしてください。

眺める: 17802|答える: 0

[通信] ロックC#

[リンクをコピー]
掲載地 2019/02/21 9:43:39 | | |
1. なぜロックするのか、何がロックされているのか?

スレッドを使う場合、最も効率的な方法はもちろん非同期で、つまり各スレッドが同時に動作し、互いに依存して待つ必要がなくなります。 しかし、異なるスレッドが特定のリソースにアクセスする必要がある場合、同期機構が必要となります。つまり、同じリソースを読み書きする際には、各操作が効果的かつ即時的に行われるようにするため、リソースを同時に1つのスレッドのみで操作する必要があります。つまり、その操作の原子性を確保するためです。 lockはC#で最も一般的に使われる同期方式であり、フォーマットはlock(objectA){codeB}です。


lock(objectA){codeB}は一見シンプルに思えますが、実際には三つの意味があり、適切に使うために不可欠です。
1. オブジェクトAはロックされているか? もしそうでなければロックしますし、そうでなければオブジェクトAが解放されるまで待ちます。
2. ロック後、他のスレッドはcodeBを呼び出したり、codeBを実行したりオブジェクトAを使えなくなります。
3. codeBを実行した後、releaseobjectAとcodeBは他のスレッドからアクセス可能です。

2. ロック(これ)はどうなったの?

例を見てみましょう。

t1スレッドではlockMeはlock(this)、すなわちメイン関数のc1を呼び出し、メインスレッドでlock(c1)を呼び出すと、t1のロックブロックが実行されるのを待ってc1にアクセスする必要があり、つまりc1に関連するすべての操作を完了できないため、c1も同様に完了します。 DoNotLockMe() は実行されません。





先の:ArraySegmentのC#
次に:Spring Bootの詳細な実践。陳少堅とSpringBootが明かす+マイクロサービスシステムを迅速に構築
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com