• 締切済み

ファイルの排他

ログの出力/照会時の排他処理について、教えて下さい。 環境 言語: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(); //排他解除 //////////////////////////////////// 以上、宜しくお願い致します。

みんなの回答

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

Monitorクラスは WinAPIで言うところのCRITICALSECTIONで実装されているようです 同期の方法にいくつかの種類がありますので現状に即した物を選択すればいいでしょう 他の同期クラスとしてはSemaphoreというのもがあります ReaderWriterLockの実装が何なのかまでは調査できませんでした VC++付属のMSDNなどで『同期プリミティブ』等を検索してみましょう

isg7
質問者

お礼

ご回答ありがとうございます。 いろいろ調査してみます。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

同期用には MutexクラスかReadWriterLockクラス等がいいでしょう Mutexなら書き込みと読み込みで Mutexオブジェクトの取得に成功したら動作するようにするといった手順です ファイルを開きっぱなしにするのであれば Read処理の間に Writerに対してFlashなどを実行してバッファを書き出すなどの処理が必要でしょう

isg7
質問者

お礼

ご回答ありがとうございます。 現行システムではMonitorクラスというもので ロックしているようです。 上のMutexクラスやReadWriterLockクラスとは違うのでしょうか?

noname#208124
noname#208124
回答No.1

読み側書き側共にFileStream使ってファイル開かないと ・Lock/Unlockメソッドが無い ・StreamReaderは常にFileShare.Readで開くので書き込み可能で開いてるファイルを開けない と思いますが

isg7
質問者

お礼

ご回答ありがとうございます。 確かにLock/UnlockはFileStreamのメソッドですね。 これを使って実装してみます。

関連するQ&A