.NETの同期と非同期ミューテックスの詳細説明
このエッセイの続き: .NET の同期と非同期のスレッドセーフ コレクション (11)
このエッセイと次の 2 つのエッセイでは、.NET の同期と非同期シリーズの最後の大きな知識ポイントである WaitHandle ファミリを紹介します。
抽象基本クラス: WaitHandle、3 つのサブクラス: EventWaitHandle (イベント通知)、Mutex (プロセス同期ロック)、Semaphone (セマフォ)、および 2 つの孫クラス: System.Threading.AutoResetEvent、System.Threading.ManualResetEvent、すべて EventWaitHandle のサブクラスです。 。
1. 抽象基本クラス WaitHandle
[ComVisibleAttribute(true)]public abstract class WaitHandle : MarshalByRefObject, IDisposable
上記の情報から、WaitHandle が MarshalByRefObject を継承し、IDisposable インターフェイスを実装していることがわかります。
MarshalByRefObject についてはあまり馴染みがないかもしれませんが、そのサブクラスの多くを使用したことがあるはずです。その正体を明らかにしましょう。
MarshalByRefObject は、MSND では次のように説明されています。
アプリケーション ドメインは、オペレーティング システム プロセス内に 1 つ以上のアプリケーションが存在するパーティションです。同じアプリケーション ドメイン内のオブジェクトは直接通信します。異なるアプリケーション ドメイン内のオブジェクトは、アプリケーション ドメインの境界を越えてオブジェクトのコピーを転送する方法と、プロキシを使用してメッセージを交換する方法の 2 つの方法で通信できます。 MarshalByRefObject は、プロキシを使用してメッセージを交換することでアプリケーション ドメインの境界を越えて通信するオブジェクトの基本クラスです。
これを見た後はさらに混乱するかもしれません。 そのサブクラスを使用しましたか? そうです、そのサブクラスが使用されており、さらに多くのサブクラスがあります。
たとえば、System.Drawing 名前空間にはブラシ、画像、ペン、フォントなどがあり、System.IO 名前空間には、よりよく知られた Stream もあります。
詳細な読み方: AOP を実装するには、MarshalByRefObject を使用します。
これを見ると、WaitHandle にはアプリケーション ドメイン間で通信する機能があることだけを知る必要があります。
2. Mutex (プロセス同期ロック)
1. MSDN では、Mutex をプロセス間の同期プリミティブ、つまりロックの概念として定義しています。
一方、Monitorは通常、アプリケーションドメイン内のスレッド間の通信にのみ使用されます。実際、ロックに使用されるオブジェクトが MarshalByRefObject から派生している場合、Monitor は複数のアプリケーション ドメインでロックを提供することもできます。
Mutexはオペレーティングシステムのリソースを呼び出す必要があるため、実行のオーバーヘッドがMonitorよりもはるかに大きいため、アプリケーション内のスレッド間の操作のみを同期する必要がある場合は、Monitor/lockを最初の選択肢にする必要があります
2。
-
WaitOne() /WaitOne(TimeSpan, Boolean) およびいくつかのオーバーロード: 所有権を要求します。この呼び出しは、現在のミューテックスがシグナルを受信するまで、またはオプションのタイムアウト間隔に達するまでブロックされます。これらのメソッドはロックを提供する必要はありません。オブジェクトを追加パラメータとして使用します。
WaitHandle.WaitOne メソッドを使用して、ミューテックスの所有権を要求できます。 次のいずれかが発生するまで、呼び出しスレッドはブロックされます:
ミューテックス信号が所有されていない。 この場合、WaitOne メソッドは true を返し、呼び出しスレッドからミューテックスの所有権を取得し、ミューテックスによって保護されているリソースにアクセスします。 スレッドがリソースへのアクセスを完了した後、ReleaseMutex メソッドを呼び出して、ミューテックスの所有権を解放する必要があります。
には、経過した WaitOne への呼び出しで指定されたメソッド millisecondsTimeout または timeout パラメーターがあります。 この場合、WaitOne メソッドは false を返し、現時点ではスレッドはミューテックスの所有権を取得しません。
ReleaseMutex(): 現在の Mutex を 1 回解放します。ミューテックスを所有するスレッドは、その実行をブロックすることなく WaitOne 一連の関数を繰り返し呼び出すことができるため、この点は一度強調しておきます。これと、Monitor の Enter()/Exit() は、オブジェクト ロックを取得した後に繰り返し呼び出すことができます。 Mutex が呼び出された回数は、共通言語ランタイム (CLR) によって保存されます。このカウントは、WaitOne() ごとに +1、ReleaseMutex() ごとに -1 になります。このカウントが 0 でない限り、他の Mutex ウェイターは保存されます。このミューテックスを検討してください。ミューテックスが解放されていない場合、ミューテックスを取得する方法はありません。 さらに、Monitor.Exit() と同様に、Mutex の所有者のみが RleaseMutex() を実行できます。それ以外の場合は、例外がスローされます。
ミューテックスを所有している間にスレッドが終了した場合、そのミューテックスは放棄されたと呼ばれます。 Microsoft は MSDN で、これは「重大な」プログラミング エラーであると警告しています。これは、ミューテックスの所有者が所有権を取得した後、WaitOne() と ReleaseMutex() の数が等しくなくなり、呼び出し元自体が無責任に終了し、ミューテックスによって保護されているリソースが不整合な状態になることを意味します。実際、これは try/finally 構造で Mutex を使用することを忘れないように注意するためのものにすぎません。
3、全局和局部的Mutex
如果在一个应用程序域内使用Mutex,当然不如直接使用Monitor/lock更为合适,因为前面已经提到Mutex需要更大的开销而执行较慢。不过Mutex毕竟不是Monitor/lock,它生来应用的场景就应该是用于进程间同步的。用于在进程间通讯的Mutex我们称为全局Mutex,而只用于在应用程序域内部通讯的Mutex、我们称为局部Mutex.
全局Mutex和局部Mutex是通过构造函数来构造不同的实例的,让我们来看一下Mutex的构造函数,一共有5个,挑两个具有代表性的看一下吧:
Mutex():用无参数的构造函数得到的Mutex没有任何名称,而进程间无法通过变量的形式共享数据,所以没有名称的Mutex也叫做局部(Local)Mutex。另外,这样创建出的Mutex,创建者对这个实例并没有拥有权,仍然需要调用WaitOne()去请求所有权。
Mutex(Boolean initiallyOwned, String name, out Booldan createdNew, MutexSecurity):第一个bool参数:指示初始化的实例是否拥有互斥体所有权。第二个string类型、为互斥体指定一个名称,如果string为null或者空字符串 则相当于创建一个没有名字的Mutex,当属于局部Mutex. 而有名字的Mutex当属于全局Mutex.第三个bool参数、如果已经初始化了互斥体 返回True, 如果互斥体已经存在则返回False. 最后一个参数用于Mutex访问的安全性控制。
4、用途
Mutex天生为进程间的同步基元,因此它可以用来控制应用程序的单实例:
/// <summary>/// 单实例运行/// </summary>/// <returns> true 应用程序已启动,false 则没有 </returns>public bool SingleRun(ref System.Threading.Mutex mutex ) { mutex = new System.Threading.Mutex(false, "WINDOWS"); if (!mutex.WaitOne(0, false)) { mutex.Close(); mutex = null; } if (mutex == null) { return true; } return false; }
以上が.NETの同期と非同期ミューテックスの詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









一般的に、同時に使用する必要があるのはヘッドフォンまたはスピーカーのいずれか 1 つだけですが、Win11 システムでヘッドフォンとスピーカーが同時に鳴るという問題が発生したと友人が報告しています。 Realtek パネルでオフにすれば問題ありません。以下を見てみましょう。 win11 でヘッドフォンとスピーカーが一緒に聞こえる場合はどうすればよいですか? 1. まず、デスクトップで「コントロール パネル」を見つけて開きます。 2. コントロール パネルに入り、「ハードウェアとサウンド」を見つけて開きます。 3. 次に、「」を見つけます。 Realtek High Definition" とスピーカーのアイコン。オーディオマネージャー" 4. [スピーカー] を選択し、[リアパネル] をクリックしてスピーカー設定に入ります。 5. 開くとデバイスの種類が表示されるので、ヘッドフォンをオフにしたい場合は、「ヘッドフォン」のチェックを外します。

同期フォルダー内の 1 つ以上のアイテムが Outlook のエラー メッセージと一致しない場合は、会議アイテムを更新またはキャンセルしたことが原因である可能性があります。この場合、ローカル バージョンのデータがリモート コピーと競合していることを示すエラー メッセージが表示されます。この状況は通常、Outlook デスクトップ アプリケーションで発生します。同期したフォルダー内の 1 つ以上のアイテムが一致しません。競合を解決するには、プロジェクトを開いて操作を再試行します。同期フォルダー内の 1 つ以上のアイテムが Outlook エラーと一致しない問題を修正する Outlook デスクトップ バージョンでは、ローカルの予定表アイテムがサーバー コピーと競合すると問題が発生する可能性があります。ただし幸いなことに、それを助ける簡単な方法がいくつかあります

現在、人工知能(AI)技術の開発は本格化しており、さまざまな分野で大きな可能性と影響力を発揮しています。本日、Dayao は、参考にしていただけるよう、4 つの .NET オープン ソース AI モデル LLM 関連プロジェクト フレームワークを共有します。 https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel は、OpenAI、Azure などの大規模言語モデル (LLM) を統合するように設計されたオープン ソース ソフトウェア開発キット (SDK) です。

win10 クリップボードの非常に便利な機能は、クロスデバイス クラウド ストレージ機能です。これは非常に便利で、ユーザーが PC デバイスとモバイル デバイスで同時にコピー アンド ペーストするのに役立ちます。設定方法は非常に簡単で、システム内のクリップボードに設定するだけです。 win10 クリップボードを携帯電話に同期する 1. まず、左下隅の [スタート] をクリックして設定を入力します。 2. 次に「システム」をクリックします。 3. 左側の「クリップボード」を選択します。 4. 最後に、右側の「デバイス間同期」で「ログイン」をクリックし、携帯電話を選択します。

同時プログラミングと非同期プログラミング 同時プログラミングは、同時に実行される複数のタスクを扱います。非同期プログラミングは、タスクがスレッドをブロックしない同時プログラミングの一種です。 asyncio は Python の非同期プログラミング用のライブラリで、プログラムがメイン スレッドをブロックせずに I/O 操作を実行できるようにします。イベント ループ asyncio の中核は、I/O イベントを監視し、対応するタスクをスケジュールするイベント ループです。コルーチンの準備が完了すると、イベント ループは I/O 操作を待つまでそのコルーチンを実行します。その後、コルーチンを一時停止し、他のコルーチンの実行を継続します。コルーチン コルーチンは、実行を一時停止および再開できる関数です。 asyncdef キーワードは、コルーチンの作成に使用されます。コルーチンは await キーワードを使用して、I/O 操作が完了するのを待ちます。 asyncio の次の基本

Baidu Cloud Sync Disk を同期するにはどうすればよいですか? Baidu Cloud Sync Disk で同期するファイルを選択できますが、ほとんどのユーザーは Baidu Cloud ファイルを同期する方法を知りません。次に、エディターが提供する Baidu Cloud Sync Disk 同期方法のグラフィック チュートリアルです。興味のあるユーザーはぜひ見に来てください! Baidu クラウド同期ディスクを同期する方法 1. まずコンピュータのデスクトップに入り、[Baidu クラウド同期ディスク] アイコンを右クリックし、[設定] を選択します; 2. 次にサービス ウィンドウを展開し、[詳細設定] ページに切り替えて、 [フォルダの選択]; 3. 最後に以下のようなページに切り替わり、同期が必要なファイルにチェックを入れて[OK]をクリックします。

並行プログラミングにおけるロックと同期 並行プログラミングでは、複数のプロセスまたはスレッドが同時に実行されるため、リソースの競合や不整合の問題が発生する可能性があります。これらの問題を解決するには、共有リソースへのアクセスを調整するためのロックと同期メカニズムが必要です。ロックの概念 ロックは、一度に 1 つのスレッドまたはプロセスのみが共有リソースにアクセスできるようにするメカニズムです。 1 つのスレッドまたはプロセスがロックを取得すると、ロックが解放されるまで、他のスレッドまたはプロセスはリソースへのアクセスをブロックされます。ロックの種類 Python にはいくつかの種類のロックがあります。 ミューテックス ロック (Mutex): 一度に 1 つのスレッドまたはプロセスのみがリソースにアクセスできるようにします。条件変数: スレッドまたはプロセスが特定の条件を待ってからロックを取得できるようにします。読み取り/書き込みロック: 複数のスレッドが同時にリソースを読み取ることができますが、1 つのスレッドのみがリソースに書き込むことができます。
