2017-03-06 27 views
1

pthreadミューテックスをプロセス間で共有することができますが、共有ミューテックスの初期化に関する質問/回答は見つかりませんでした。プロセス間でpthreadミューテックスを正しく使用する

私が理解する限り、プロセス共有ミューテックスを使用する一般的な方法は次のとおりです。共有メモリのブロックを割り当て、共有メモリブロックのpthread mutexを初期化して使用します。

共有メモリを作成する場合、複数のプロセスが同じキーIDを持つ共有メモリブロックを割り当てようとすると、OSによって処理されます。わかりませんが、どうやって共有メモリーブロックのmutexを安全に初期化できますか?

pthread_mutex_initは、異なるプロセスから同時にpthread_mutex_tを初期化するための安全な方法を提供していません。はいの場合、共有「相互排除」を初期化するプロセスに排他アクセスを提供するにはどうすればよいですか?そして、別のプロセスがmutexを正常に初期化したかどうかをどうすれば確認できますか?

2番目の質問は、mutexをブロックしているプロセスがクラッシュした場合です。 OK、そのようなケースを処理し、対応するエラーコードを返す強力なミューテックスがあります。共有メモリブロックはどうですか?プロセスが共有メモリを使用して破壊する最後のプロセスであるかどうかは、プロセスが注意する必要があるようです。

+0

好奇心ではなく、代わりにPOSIXセマフォを使用してみましょう。 http://man7.org/linux/man-pages/man7/sem_overview.7.html pthread_mutexとは異なり、POSIXセマフォはプロセス間通信のためのものではありません。 –

+0

@jameslargeこれは良い質問です。セマフォの代わりにmutexを使うことを勧めている人もいます。たとえば、http://stackoverflow.com/q/6477525/465662私は本当の利点を見つけようとしています – Rom098

答えて

1

pthread_mutex_initは、異なるプロセスから同時にpthread_mutex_tを初期化するための安全な方法を提供していませんか?

正しい。 1つのプロセスだけがmutex上でpthread_mutex_init()を呼び出し、その呼び出しが正常に戻るまでそのプロセスがそのミューテックスを操作しようとしないようにすることは、あなた次第です。例えば

、POSIX shm_open()共有メモリ領域と、あなたは正確に一つのプロセスがそれを作ることに成功しますように、プロセスは、O_CREATO_EXCLフラグと地域を開こうとすることができます。このプロセスは、共有メモリ領域のサイズを変更し、pthread_mutex_init()でミューテックスを初期化します。他のプロセスは、共有メモリ領域を開く前に、初期化プロセスから何らかの通知を待たなければなりません。例えば、プロセスがブロックO_RDONLYを開くことをブロックし、FIFO O_WRONLYを開いて初期化プロセスに通知させます成功へのオープン)。

通常、共有メモリセグメントはプロセス間の唯一の通信チャネルにはなりません。通常、UNIXドメインソケットを介して通信をブートストラップし、その上に共有メモリ領域ファイルディスクリプタをSCM_RIGHTSメッセージで渡しても、共有メモリ領域の設定をネゴシエートします。共有メモリ領域は、パフォーマンスに敏感なIPCを高速化するために使用されます。

関連する問題