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

眺める: 49134|答える: 4

[出典] .NET/C# ロック原理モニターは詳細な説明を提供します

[リンクをコピー]
掲載地 2021/04/29 9:54:10 | | | |
lock文は与えられたオブジェクトのミューテックスを受け取り、文ブロックを実行し、その後ロックを解放します。 錠を保持している糸は、錠を保持して再び鍵を解除することができます。 他のスレッドはロックを取得できず、ロックが解除されるまで待ちます。

復習:

.net/c# ユーザーマルチスレッド同時実行ロック(string){...}詳解
https://www.itsvse.com/thread-7764-1-1.html

鍵コードを使え

相当

ロックの基盤となるコードはMonitorによって実装されていると考えられます。

コードが「try...」と書いているので、 FinalBlockを使います。つまり、Lock文の本文に例外が出されても、ロックは解放されます。

文体の中に「wait」オペレーターロックを使うことはできません。文中では使えません待ってオペレーターロック。 文体の中に「wait」オペレーターロックを使うことはできません。 文体の中に「wait」オペレーターロックを使うことはできません。 この文はとても重要です!

ドキュメンテーション:ハイパーリンクのログインが見えます。

自分でコードをテストしています。タスクでロックを手に入れ、awaitでブロックします、コードは以下の通りです:

次のコードを何度も実行した後、実行結果は期待通りに出ません。



なぜでしょうか。 ロックブロックでwaitキーワードを使おうとすると、このコンパイルエラーが発生します:lock 文の本文に wait できません。 その理由は、awaitが完了した後、そのメソッドがawaitキーワードの前のスレッド(呼び出しスレッド)ではなく、別のスレッドで実行される可能性があるからです。lockkeyword同じスレッドですロックを解除し、ロックをロックに入れて解除
理由をより直感的に理解できるようにコードを修正してください:

ロックのネジのIDとロックリリースのスレッドIDを取得してください。もちろんスレッドには載っていませんしたがって、ロックは下図のように解除できません。



コードを修正し、スレッドでテストし、何度も実行しましたが、期待通りに動作しました。コードは以下の通りです:



(終わり)





先の:(to).NET/C# を圧縮してフォルダをzipファイルにパッケージ化します
次に:Redisは詳細な説明のためにLuaスクリプトを使用しています
 地主| 掲載地 2022/02/10 9:20:09 |
 地主| 掲載地 2023/06/25 19:57:43 |
オブジェクト同期メソッドは、同期されていないコードブロックから呼び出しられました。
以下のコードは上記のエラーを示します




 地主| 掲載地 2023/08/12 19:47:49 |
ロック構文シュガーは以下の通りです:






 地主| 掲載地 2024/07/11 10:44:02 |
【Turn】C#のマルチスレッド同時処理は様々なロックの下で実現
https://www.itsvse.com/thread-10561-1-1.html
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com