47938


マルチスレッドで動作するログ監視ツールの作成を考えています。  
監視インスタンスがひとつの場合の全体像として

[.NET Form]<->[C++/CLI wrapper]<->[監視インスタンス+バッファ]<->[ログファイル]

のようになっており、監視インスタンスが最大で16個となる見込みです。  
監視インスタンスの動作として  
(1)ログファイル1つを定期的にリードしてバッファに結果を書き込む  
(2).NETのFormで指定された処理を実行して結果をFormに返す  
のように考えています。  
(1)の処理は(2)とは別のスレッドで、常に実行されることを期待しています。

このようなツールにおいて  
・各監視インスタンスに1つの専用バッファをもたせる  
・専用バッファのスレッドセーフを保証する  
これらをどのように実装すればよいか教えていただきたいと思います。

環境は下記のとおりです。  
Visual C++ 2015  
.NET v4.5.2

よろしくお願いします。


CC BY-SA 4.0
2018-08-28T11:21:32.003
47885
2018-08-30T08:11:26.790
19500
question
c++ .net c++-cli
スレッドセーフなバッファを各監視インスタンスに持たせた.NET C++/CLIフォームの設計


ざっくり言えば、C++ならWin32APIのMutexとEventを使って排他制御すれば良いでしょう。  
以下のような処理になります。

最初に排他制御が必要な資源・箇所の数だけCreateMutexでMutexを作成  
キャンセル/終了指示のためにMutexと同じ数だけCreateEventでEventを作成

排他制御が必要な一連の処理の直前にMsgWaitForMultipleObjectsで排他制御権を獲得する  
パラメータのハンドル配列には上記のEventとMutexのハンドルを指定

Mutexで排他制御権が獲得できていれば、資源等に対する処理を行う  
処理が終了したらReleaseMutexで排他制御権を解放する

Mutexでは無くてEventが通知されていたらキャンセル/終了処理を行う

MutexでもEventでも無い場合はスレッドに届いたWindowMessageの処理を行う  
処理すべきWindowMessageが無くなったらMsgWaitForMultipleObjects呼び出しに戻る

キャンセル/終了で資源に関係する全てのスレッドが終了したら、対応するMutex/EventをCloseHandleする


CC BY-SA 4.0
2018-08-30T08:11:26.790
47938
2018-08-30T08:11:26.790
26370
47885
answer