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

眺める: 4864|答える: 4

[出典] 【Turn】C#のマルチスレッド同時処理は様々なロックの下で実現

[リンクをコピー]
2023年4月13日 18:44:49に投稿 | | | |
通常、マルチスレッドプログラミングが関与している限り、プログラムの複雑さは大幅に増加し、パフォーマンスは大幅に低下し、バグの発生確率も大幅に高まります。

マルチスレッドプログラミングは、データ処理能力を向上させるためにプログラムを並列実行することを意図していますが、多くの場合、共有リソースの競争が起こるため、リソースオブジェクトを変更する際にはロックしなければなりません。 しかし、ロックを実装する方法は多岐にわたるので、C#におけるいくつかの種類のロックの実装とパフォーマンスを見てみましょう。

錠前のいくつかの使い方

1. 原子ロック

原子力操作「Interlocked.CompareExchange」を通じて「ロックレス」競争を実現します。

公式の説明は、複数のスレッドで共有される変数に対して原子操作を提供することです。 名前空間:System.Threading

2. 臨界領域

複数のスレッドをシリアライズして公開リソースやコードへのアクセスは高速で、データアクセスの制御に適しています。 C#のロック構文は、重要な領域(Monitor)の構文シュガーです。

3. 原子力の操作

原子操作は特別なケースですが、本質的にスレッド安全なのでロックする必要はありません。

公式には、特定の変数の値を原子演算の形で増やし、その結果を保存することを意味します。 名前空間:System.Threading

4. 読み書きロック

読み書きロックは他のプログラムが書き込む際にリソースの読み込みを可能にするため、リソースがダーティリードを許可するならこの方法が適切です。

公式説明では、リソースアクセスを管理するためにロック状態が使われており、マルチスレッドの読み込みや排他的書き込みアクセスを可能にするとされています。 名前空間はSystem.Threadingです

5. セマフォ

限られたユーザーリソースを制御するために設計されたセマフォ。

公式の説明では、同時にリソースやリソースプールにアクセスできるスレッドの数を制限しています。 名前空間はSystem.Threadingです

6. イベント

スレッドにいくつかのイベントが発生し、後継タスクの開始を通知するために使われます。

公式の説明では、スレッド同期イベントはスレッドが解放された後に信号が受信されると自動的にリセットされるとされています。 そのようなタイプは遺伝できません。

7. 相互排除

System.Threading 名前空間のすぐ下にあるC#のMutexクラスは、実際にはミューテックスであり、複数のスレッド間のリソース競合を扱うだけでなく、プロセス間のリソース競合も扱えます。


パフォーマンステストコード

コードを実行してください

パフォーマンステスト結果



注:上記のデータは現在のテスト環境のハードウェア性能の結果であり、互いに比較するのみ可能です。

1) さまざまなテストでは、ロックされない方が確実に最速なので、ロック操作につながるリソース競争は避けるようにしましょう。

2) Interlocked.CompareExchangeはマルチスレッドで常に優れた性能を示し、2位にランクインしています。

3) 3つ目のロック、すなわちクリティカルゾーンも良好なパフォーマンスを示しているので、ロック性能が低いと言われる人には反論してください。

4) 4つ目は原子変数(原子)操作ですが、現時点では変数の自己増加と減算のみをサポートしており、適用可能性はあまり強くありません。

5) 5つ目の読み書きロック(ReaderWriterLockSlim)のパフォーマンスもまずまずで、読み込みを行わず、実用性も比較的良好です。

6) 残りのセマフォ、イベント、ミューテックスは最も性能が悪いもので、もちろんそれぞれ適用範囲はありますが、資源競争への対応にはあまり適していません。

元のリンクアドレス:ハイパーリンクのログインが見えます。





先の:ASP.NET コア(16) 動的登録サービスの注入に依存
次に:SoftルートOpenWrtはUSBメモリ経由で起動します
 地主| 2023年4月13日 18:46:52 に投稿 |
C#プログラムは正しいコードを実行できるインスタンスを1つだけ許可します
https://www.itsvse.com/thread-3391-1-1.html

C#スレッドが学習するManualResetEventとAutoResetEventの違い
https://www.itsvse.com/thread-4810-1-1.html

[実戦]。 NET/C#はSemaphoreSlimを使って並行実行メソッドを制限しています
https://www.itsvse.com/thread-10259-1-1.html

C# Read/write Lock ReaderWriterLockSlim の使用
https://www.itsvse.com/thread-3545-1-1.html

.net/c# ユーザーマルチスレッド同時実行ロック(string){...}詳解
https://www.itsvse.com/thread-7764-1-1.html
2023年4月13日 19:21:44に投稿 |
少し学んでみて...
2023年5月16日 20:03:52に投稿 |
少し学んでみて...
2023年5月19日 11:41:25に投稿 |
学ぶために
免責事項:
Code Farmer Networkが発行するすべてのソフトウェア、プログラミング資料、記事は学習および研究目的のみを目的としています。 上記の内容は商業的または違法な目的で使用されてはならず、そうでなければ利用者はすべての結果を負うことになります。 このサイトの情報はインターネットからのものであり、著作権紛争はこのサイトとは関係ありません。 ダウンロード後24時間以内に上記の内容を完全にパソコンから削除してください。 もしこのプログラムを気に入ったら、正規のソフトウェアを支持し、登録を購入し、より良い本物のサービスを受けてください。 もし侵害があれば、メールでご連絡ください。

Mail To:help@itsvse.com