web-dev-qa-db-ja.com

共有メモリ内の場合、pthreadミューテックスはスレッド間で機能しますか?

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

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

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

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

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

22
anon

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

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

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

16
Steve Jessop

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

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

6
Void

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

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バージョンなど?

1