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