アプリ版:「スタンプのみでお礼する」機能のリリースについて

ログの出力/照会時の排他処理について、教えて下さい。

環境
言語: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();
//排他解除
////////////////////////////////////

以上、宜しくお願い致します。

A 回答 (3件)

Monitorクラスは WinAPIで言うところのCRITICALSECTIONで実装されているようです



同期の方法にいくつかの種類がありますので現状に即した物を選択すればいいでしょう
他の同期クラスとしてはSemaphoreというのもがあります

ReaderWriterLockの実装が何なのかまでは調査できませんでした

VC++付属のMSDNなどで『同期プリミティブ』等を検索してみましょう
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

いろいろ調査してみます。

お礼日時:2009/02/25 01:28

同期用には MutexクラスかReadWriterLockクラス等がいいでしょう



Mutexなら書き込みと読み込みで Mutexオブジェクトの取得に成功したら動作するようにするといった手順です

ファイルを開きっぱなしにするのであれば
Read処理の間に Writerに対してFlashなどを実行してバッファを書き出すなどの処理が必要でしょう
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

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

お礼日時:2009/02/24 00:46

読み側書き側共にFileStream使ってファイル開かないと


・Lock/Unlockメソッドが無い
・StreamReaderは常にFileShare.Readで開くので書き込み可能で開いてるファイルを開けない
と思いますが
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

確かにLock/UnlockはFileStreamのメソッドですね。
これを使って実装してみます。

お礼日時:2009/02/24 00:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!