|
分類:[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処理ループが停止している(出力が停止するため)用です。
|