C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

セマフォオブジェクトの使い方について

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■91017 / inTopicNo.1)  セマフォオブジェクトの使い方について
  
□投稿者/ so (3回)-(2019/05/17(Fri) 13:53:52)

分類:[C/C++] 

Visual C++ 2010 Express を使用しています。

複数のプロセスから共有メモリ(メモリマップドファイル使用)にアクセスするにあたり、
セマフォを使った排他制御を考えています。

CreateSemaphore、OpenSemaphoreの使い分けについて
他のウェブサイトを見ていてもよくわからず、質問させていただきました。
複数のプロセスでCreateSemaphoreをしているプログラム例もありましたが
問題はないのか?という点も気になります。


以下のようなイメージを考えていますが、使い方としてはこれで良いのでしょうか?

1. プロセスが複数あるので、その中の1つを親プロセスとします。

2. 親プロセスでCreateSemaphoreを使ってセマフォオブジェクトを生成、
子プロセスでOpenSemaphoreを使ってセマフォオブジェクトをオープン

3. どのプロセスからでも共有メモリにアクセス(読み込み・書き込み)する際は
WaitForSingleObjectを使ってシグナル状態であるかどうかを確認

4. シグナル状態であれば、共有メモリへのアクセスを実行

5. どのプロセスからでも共有メモリへのアクセスが終わったらReleaseSemaphoreを使って解放




引用返信 編集キー/
■91019 / inTopicNo.2)  Re[1]: セマフォオブジェクトの使い方について
□投稿者/ 774RR (688回)-(2019/05/17(Fri) 15:04:26)
上記の理解であってると思います。
CreateSemaphore を最初に1回だけする(子プロセス・スレッドを作る前に親が行う)
OpenSemaphore で子プロセス・スレッドがそのセマフォを共有する
でOKっす。

このロック方式でよいかどうかは案件次第。
共有メモリの排他をしたいだけなら、たいていは Readers-Writer-Lock のほうが良いっす。
Readers (複数) - 読みたいプロセス・スレッドは複数が同時に読み込みをして良い
Writer (単数) - 書きたいプロセス・スレッドは同時には1つのみ許す
(当然 Writer がロックしている間は Readers はすべて排他される)

ちなみに Mutex ってのは binary semaphore と同じで、ロック数1のものをいい
Semaphore ってのはロック数2以上のものをいう、のが普通っぽいです(業界で違うかも)
単に Semaphore を使っただけだと、書き込みも複数同時にできるので Readers-Writer-Lock になりません。

引用返信 編集キー/
■91020 / inTopicNo.3)  Re[2]: セマフォオブジェクトの使い方について
□投稿者/ Hongliang (805回)-(2019/05/17(Fri) 15:18:06)
> 複数のプロセスでCreateSemaphoreをしているプログラム例もありましたが
> 問題はないのか?という点も気になります。
名前を指定してCreateSemaphoreを呼び出す場合、まだ作られていなければ新しくセマフォを作成し、すでに作られていれば既存のセマフォをオープンするという挙動になります。
なので使い方としては問題ありません。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ