MacでPTHREAD_PROCESS_SHAREDは使えない
preforkサーバのようにプロセス間でロック機構を使いたい場合には、fcntl関数によるPosixファイルロックやディスクリプタパッシングなどの方法が用いられる。
pthreadの機能を使ったスレッドロックもその内の一つで、通常単一プロセスのスレッド間に用いるスレッドロックを、異なるプロセス間で適用する方法である。
この方法はファイルロックに比べて高速で動作させることができるのがメリットだ。
使う方法は、
- pthread_mutexattr_t構造体をデフォルトで初期化する
- PTHREAD_PROCESS_SHARED属性を設定する
- pthread_mutex_initで相互排除変数を初期化する
- 相互排除変数をロックする
- 相互排除変数をアンロックする
となる。
// 相互排除変数 pthread_mutex_t *mptr; // 属性構造体 pthread_mutexattr_t mattr; // 属性初期化 pthread_mutexattr_init(&mattr); // 複数プロセス間での共有 pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED); // 相互排除変数を初期化 pthread_mutex_init(mptr, &mattr); // 相互排除変数をロック pthread_mutex_lock(mptr); /* 任意の処理 */ // 相互排除変数をアンロック pthread_mutex_unlock(mptr);
ここで表題の件となるが、この方法はMacだと動かない。
pthread_mutex_initを呼び出した時点でプロセスが異常終了してしまう。
調べてみると下記のページが見つかった。
developer.apple.com
ここには以下の通り報告されている。
BUGS The PTHREAD_PROCESS_SHARED attribute is not supported.
直してくれよ。