ファイルの排他
ログの出力/照会時の排他処理について、教えて下さい。
環境
言語:VC++/CLI
OS:Win VISTA
前提
ログ出力
・APL起動時にログファイルをオープンする。
(基本的にはオープンしっぱなし)
・メッセージ受信などイベント取得時にログに書き込む。
(複数スレッドからの書込み処理あり)
・最大行数に達したら、ファイルをクローズして、
新規にファイルをオープンしてそちらに書き込む。
(aaa_1.log, aaa_2.log,・・・という具合)
ログ照会
・画面からボタン押下で今まで書き込んだログを照会する。
・ログ照会時はオープン→リード→クローズとなります。
質問
複数スレッドから書込み処理がある場合に備えて排他をかける
「読み込み時に書込み発生(EOFがおかしくなるとか)」や
「書込み時に読み込み発生(行の半端なところで表示されるとか)」など、バッティングした際を考慮した排他のかけ方
について注意点があればご教授頂きたいのですが・・・
単純に以下のような実装イメージでよろしいのでしょうか?
////////////////////////////////////
書込み処理
//変数定義
StreamWriter^ sw = nullptr;
起動時
メソッド1
sw = gcnew StreamWriter( "TestFile.txt" );
最大行数に達したら
メソッド2
sw->Close();
sw = gcnew StreamWriter( "TestFile2.txt" );
//イベント発生
メソッド3
//排他処理
sw->WriteLine( "aaaa" );
//排他解除
////////////////////////////////////
////////////////////////////////////
照会処理
//n=ファイルサイズを求めておく;
//排他処理
StreamReader^ sr = gcnew StreamReader( "TestFile.txt" );
array<Char>^c = nullptr;
while ( sr->Peek() >= 0 )
{
c = gcnew array<Char>(n);
sr->Read( c, 0, c->Length ); //ある理由でReadLineが
//使えそうにないです
//理由を説明すると
//長くなりそうなので
//省かせて下さい
//画面出力領域 ← c
}
sr->Close();
//排他解除
////////////////////////////////////
以上、宜しくお願い致します。
お礼
排他制御って難しいですね。 プロジェクトは排他制御の仕様はなしになりました。 回答ありがとうございました。