23

私はこれを見つけました: 高速プロセス間同期方法

私は、pthread ミューテックスは同じアドレス空間内の 2 つのスレッド間でのみ共有できると信じていました。

そこにある質問/回答は、次のことを暗示しているようです。

2 つの別個のプロセス A と B があるとします。それらには共有メモリ領域 M があります。M に pThread ミューテックスを配置し、A でロックし、B でロックし、A でロック解除できます。B はミューテックスをブロックしなくなります。これは正しいです?2 つの別々のプロセスで pThread ミューテックスを共有できますか?

編集: MacOSX で C++ を使用しています。

4

3 に答える 3

17

ミューテックスが初期化されたときにプロセス共有になるように指示する必要があります。

http://www.opengroup.org/onlinepubs/007908775/xsh/pthread_mutexattr_setpshared.html

特に、「属性のデフォルト値は PTHREAD_PROCESS_PRIVATE です」に注意してください。これは、異なるプロセスからアクセスすることは未定義の動作であることを意味します。

于 2010-03-05T23:35:42.893 に答える
6

_POSIX_THREAD_PROCESS_SHAREDC/pthread ライブラリが準拠している場合、機能テスト マクロが 以外の値に定義されているかどうかを確認するか、 if を-1使用して実行時にシステム構成を照会することにより、複数のプロセスで共有されるミューテックスをサポートしているかどうかを確認できるはずです。sysconf(_SC_THREAD_PROCESS_SHARED)機能テスト マクロは未定義です。

編集:スティーブが指摘したように、プラットフォームが上記の機能をサポートしていると仮定すると、プロセス間で共有するためにミューテックスを明示的に構成する必要があります。

于 2010-03-05T23:31:29.547 に答える
1

共有メモリのミューテックスが適切に動作しない可能性があるのではないかと心配していたので、掘り下げて、問題を簡単に扱うドキュメントをいくつか作成しました。

https://computing.llnl.gov/tutorials/pthreads/

しかし、さらに掘り下げると、古いバージョンの glibc は共有メモリミューテックスで問題を抱えていることがわかりました: (これは昔からの変更ですが、要点を示しています。)

in linuxthreads/mutex.c
int __pthread_mutexattr_setpshared(...) {
    /* For now it is not possible to shared a conditional variable. */
    if (pshared != PTHREAD_PROCESS_PRIVATE)
    return ENOSYS; 
}

使用している pthread の実装に関する詳細がなければ、安全かどうかを判断するのは困難です。

私の懸念の原因は、多くの実装 (および perl、python、ruby などの一部の言語全体) が、共有オブジェクトへのアクセスを管理するグローバル ロック オブジェクトを持っていることです。そのオブジェクトはプロセス間で共有されないため、ミューテックスはおそらくほとんどの場合機能しますが、2 つのプロセスが同時にミューテックスを操作していることに気付くかもしれません。

これがミューテックスの定義に反していることは知っていますが、可能です:

2 つのスレッドが異なるプロセスで同時に動作している場合、それらは異なるコア上にあることを意味します。どちらもグローバル ロック オブジェクトを取得し、共有メモリ内のミューテックスを操作します。pthread 実装がキャッシュを介してミューテックスの更新を強制する場合、両方のスレッドがミューテックスを保持していると考えて、両方のスレッドが同時に更新される可能性があります。これは、頭に浮かぶ可能性のある失敗ベクトルにすぎません。他にもいくらでもあるだろう。あなたの状況の詳細は何ですか - OS、pthreads のバージョンなど?

于 2010-03-05T19:44:03.170 に答える