0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C言語でマルチプロセスの排他制御のやり方

Posted at

概要

C言語にて、実行ファイルが異なる場合のマルチプロセスでの排他を行ったときのメモ

コード

GitHub

処理の流れ

  1. 共有メモリのkeyを作成
  2. 共有メモリを作成
  3. 共有メモリ上にmutexオブジェクトを作成
  4. 共有メモリ上のmutexでロック/アンロック

1. 共有メモリのkeyを作成

あまり気にしない場合、shmgetで使用する key は IPC_PRIVATE としていたが、マルチプロセスだとそれぞれで共有メモリを作成してしまう。
その状態だと、mutex作成後のforkではうまくいくが、実行ファイルが異なるとうまく排他できない。

そのため、shmget で key を指定することで、別の実行ファイルでも同じ共有メモリを使用できるようになる。

ftok は、存在するファイルパスと 0 以上の proj_id で key を作成してくれる。

2. 共有メモリを作成

作成した key を使い、shmget する。

IPC_CREAT | IPC_EXCL を指定すると、key に対する共有メモリが存在しない場合には作成し、すでに存在する場合はエラーとなる。
これによって、この後の初期化関連の処理をするかしないかを判断できる。

3. 共有メモリ上にmutexオブジェクトを作成

通常と変わらず、mutexオブジェクトを作成する。

4. 共有メモリ上のmutexでロック/アンロック

通常と同じく、必要な箇所でロック/アンロックする。

まとめ

  • 実行ファイルが異なる場合には共有メモリの key を指定しなくてはならない。
  • 実行ファイルが一つなら pthread_mutexattr_setpshared のみで大丈夫そう。
    • IPC_PRIVATE が使える。

懸念点

  • ftok が衝突する確率の確認
0
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?