複数のプロセスで名前のないPOSIXセマフォを使用するには、共有メモリの一部へのアクセスを作成/取得する必要があります。その後、プロセスはsem_init
共有メモリへの参照を最初の引数として使用してセマフォを呼び出して初期化する必要があります。しかし、これは一度だけ許可されます!
POSIX説明する:
すでに初期化されているセマフォを初期化しようとすると、未定義の動作が発生します。
問題は、セマフォが存在して初期化されたかどうかを原子的にテストし、存在しない場合は初期化する方法がないことです。
セマフォが初期化されたかどうかを示すために、共有メモリにブールフラグを追加したいと思うかもしれませんが、これは明らかに競合状態を生成します。セマフォを使うときは確かに見たくないです:)
XSI(System Vとも呼ばれる)セマフォは、競合なしに正しく初期化するためにかなり複雑な方法が必要ですが、安全にすることができます(たとえば、APUEの実装を参照)。また、名前付きPOSIXセマフォはフラグをsem_open
受け入れてO_EXCL
セマフォの値を初期化する可能性があるため、この問題を示していません。
それでは、セマフォを初期化した後に他のプロセスを同期または分岐するために他の方法に頼らず、プロセス間で名前のないPOSIXセマフォを安全に共有するにはどうすればよいですか?私は何を見逃していますか?