3

Windows は、メモリ マップ ファイルに配置して複数のプロセスで使用できるミューテックスを提供していますか?

理想的には、再起動後もファイル内で単独で存続できるように、完全に自己完結型である必要があります。また、プロセスが実行されていないときにファイルを手動で削除するだけで、リソースがリークすることはありません。

可能であれば、ソリューションは、付随する「条件」の概念も提供する必要があります。これは、共有メモリにマップされたファイルに配置できるオブジェクトでもある必要があります。

つまり、SHARED 属性を持つ PTHREADS ミューテックスに似たものが必要です。

私の知る限り、PTHREADS の Windows ポートでは SHARED 属性がサポートされていないため、単純に PTHREADS ミューテックスを使用することはできません。

4

3 に答える 3

3

同期オブジェクトを共有するには、名前を付け、オブジェクトを作成するときに各プロセスで同じ名前を使用します。

次の同期オブジェクトは、プロセス間で共有できます。

クリティカル セクションは共有できませんが、高速です。

これらのオブジェクトのテストまたは待機は、多くの場合、 WaitForMultipleObjects関数の待機ファミリーを使用して行われます。

于 2013-01-18T15:47:15.283 に答える
2

ファイルを独自のミューテックスとして使用する:LockFileEx関数を使用して、ミューテックスを要求するときにファイルのバイト 0 をロックすることに全員が同意するようにします。

于 2013-01-18T17:34:28.037 に答える
1

それは可能ではありません。ミューテックス オブジェクト自体はカーネル空間に存在し、ユーザー コードがその状態をいじることから保護します。取得したハンドルは、それを取得したプロセスに対してのみ有効です。技術的には、DuplicateHandle() を使用して、返されたハンドルを mmf に入れることができますが、メモリ セクションにアクセスする他のプロセスへのハンドルがある場合に限ります。それはかなり脆いです。

これが、CreateMutex() 関数でミューテックスの名前を指定できる理由です。他のプロセスは、OpenMutex 呼び出しで同じ名前を使用してそれにアクセスします。

于 2013-01-18T15:48:08.833 に答える