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

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

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

Mutexを使用した排他制御について

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

■91173 / inTopicNo.1)  Mutexを使用した排他制御について
  
□投稿者/ auto (2回)-(2019/06/05(Wed) 15:12:18)

分類:[C/C++] 

現在、Mutexを使用した排他制御を行う処理を作成しています。

テスト用プログラムを作り、動作確認をしていますが
WaitForSingleObjectにて待ち続けたまま処理が止まってしまう現象が起きています。

開発環境、実装、現象を記載しますので、
実装方法でおかしな点や、(排他制御のタイミング?など)
チェックした方がよい点についてご教示いただきたく、よろしくお願いいたします。


[開発環境]
Visual C++ 2010 Express
Win32 コンソールアプリケーションを使用しています。

[実装]
a. 共有メモリ用のクラス CSharedMemoryを作成。
   このクラスでやっていること
   public:
     コンストラクタ  ※ここでMutexのハンドル(メンバ変数)をNULLにする
     共有メモリ作成   (CreateFileMapping使用)
     共有メモリ破棄  
     共有メモリWrite ※まずOpenMutexで既存のMutexオブジェクトがないか確認。なければCreateする。共有メモリへのアクセス時は後述のLock/Unlock関数を使用
     共有メモリRead  ※まずOpenMutexで既存のMutexオブジェクトがないか確認。なければCreateする。共有メモリへのアクセス時は後述のLock/Unlock関数を使用
     デストラクタ    ※CreateMutexでMutexオブジェクトを作成したときは、ここでMutexのハンドル(メンバ変数)をNULLにする
   private:
     Lock関数        ※ここでWaitForSingleObjectを使って待つ
     UnLock関数      ※ここでMutexオブジェクトのReleaseを実施

b. 共有メモリにアクセスするためのラッパークラスを作成
   このクラスの関数は全てstatic型とする。
   関数内で CSharedMemoryクラスの実態を作成(newで作成)し、
   共有メモリWrite または 共有メモリReadの関数を呼び出して共有メモリにアクセスしています。
   (b.を使う人は、共有メモリの排他制御の事は考えなくても良い仕組みとしている)

c. a, bを使用したプログラム Create.exe と Read.exeを作成
   Create.exeでは共有メモリ作成を行い、その後forループで共有メモリへのアクセスを行う
   Read.exeでは、2本のスレッドを走らせ、どちらにもforループを実装。Create.exeで作成された共有メモリへのアクセスを行う。

[現象]
   c.のCreate.exeを起動させたのち、Read.exeを起動させています。
   どちらも共有メモリから読み出したデータをprintf_s関数でコンソール画面に出力しています。
   Create.exeのRead処理ループ 、または Read.exeのRead処理ループが停止している(出力が停止するため)用です。


引用返信 編集キー/
■91174 / inTopicNo.2)  Re[1]: Mutexを使用した排他制御について
□投稿者/ auto (3回)-(2019/06/05(Wed) 15:18:16)
補足です。
処理が固まってしまった(出力が停止した)際のWaitForSingleObjectの戻り値を確認したところ、128(ERROR_WAIT_NO_CHILDREN)となっていました。
引用返信 編集キー/
■91206 / inTopicNo.3)  Re[2]: Mutexを使用した排他制御について
□投稿者/ auto (4回)-(2019/06/06(Thu) 09:59:26)
タスクマネージャで該当プロセスを追うと、ハンドル数が増加していくため、
ハンドルリークが原因であると考え、処理を見直しました。
Mutexオブジェクト変数をローカル変数とし、使用前にOpenまたはCreateを実施。
使用後は必ずReleaseしてCloseするように処理を変更したところ、
ハンドル数が増加し続けることなく、6時間以上連続で動作することを確認できました。
解決済み
引用返信 編集キー/

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


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

このトピックに書きこむ