2

mqueue を実装するために pthread win32 ライブラリを使用しています。しかし、次のコードが実行されると、#40 エラーがスローされます。これは、システムがサポートされていないことを意味します。

pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
i = pthread_mutex_init(&mqhdr->mqh_lock, &mattr);
pthread_mutexattr_destroy(&mattr);      /* be sure to destroy */

それがうまくいかなかった後、私は40歳です。これについて考えている体はありますか?または、どの種類のWIN32スレッド関数を使用して置き換えるなど、他の代替ソリューションがありますか。

注: win32 で mqueue の実装に成功した人はいますか? ありがとう

4

5 に答える 5

1

Windows のプロセス間同期機能について読みたいと思うでしょう。

Windows のプロセス間ミューテックスの場合、共有メモリとInterlockedCompareExchange (スピンしてからスリープするか、Eventを監視する) を使用して独自のミューテックスを実装することを選択できます。

または、OS が提供する名前付きMutexオブジェクトを使用する方が、プログラミングは簡単ですが、パフォーマンスは劣ります。これらは、プロセスのスレッド内でCriticalSectionを使用するよりも約 10 倍悪いパフォーマンスを示します。

Linux pthreads から移植した私自身の製品コードでは、最初のソリューションで遊んでいましたが、Mutex ソリューションを使用してコードをリリースすることになりました。より信頼性が高く、すべての場合に機能すると確信していました。

于 2010-11-16T01:46:19.120 に答える
0

•CreateMutex の lpMutexAttributes パラメータで継承が有効になっている場合、CreateProcess 関数によって作成された子プロセスは、ミューテックス オブジェクトへのハンドルを継承できます。このメカニズムは、名前付きミューテックスと名前なしミューテックスの両方で機能します。

• プロセスは、DuplicateHandle 関数の呼び出しでミューテックス オブジェクトへのハンドルを指定して、別のプロセスで使用できる複製ハンドルを作成できます。このメカニズムは、名前付きミューテックスと名前なしミューテックスの両方で機能します。

• プロセスは、OpenMutex または CreateMutex 関数の呼び出しで名前付きミューテックスを指定して、ミューテックス オブジェクトへのハンドルを取得できます。

于 2010-11-16T20:03:58.053 に答える
0

Win32 PThread ライブラリ内でハッキングすることに慣れているかどうかはわかりませんが、PTHREAD_PROCESS_SHARED の完全な動作を達成することはできませんが、DuplicateHandle API を使用してカーネル オブジェクトへのハンドルを他のプロセスに複製することは可能です。プロセス間でミューテックスを共有できるようにするいくつかの Windows 固有の拡張機能 (UNIX ビルドでコンパイルされる) を追加します。

于 2010-11-16T09:37:35.927 に答える