C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: Synchronizedについて


(過去ログ 26 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■11951 / inTopicNo.1)  Synchronizedについて
  
□投稿者/ makoto (1回)-(2007/12/26(Wed) 09:47:52)

分類:[C#] 

makotoと申します。
現在ログを出力するプログラムを作成しているのですが、
困ったことがあります。ログを出力するプログラムは色々なプロセスから
呼び出されてひとつのログファイルに書き込みを行います。
とりあえず作成が終わったのでテストをしていたのですが、以下のようなエラーが発生したので
System.IO.IOException: プロセスはファイル "c:\Err.log" にアクセスできません。このファイルは別のプロセスが使用中です。
スレッドセーフにする必要があると思い

System.IO.TextWriter tw = System.IO.TextWriter.Synchronized(swFromFile);
上記のようにSynchronizedにしてもう一度動かしたのですが、
System.IO.IOException: プロセスはファイル "c:\Err.log" にアクセスできません。このファイルは別のプロセスが使用中です。
のメッセージが出てしまいます。何か他に設定が必要なのでしょうか?

作成環境は
.Net Framework 1.1を使用しています。



引用返信 編集キー/
■11952 / inTopicNo.2)  Re[1]: Synchronizedについて
□投稿者/ なちゃ (88回)-(2007/12/26(Wed) 10:08:36)
ライブラリ機能のスレッドセーフとリソースの排他制御は基本的に別に考えないとダメです。
※何が排他されるのかが重要

また複数プロセスで使用する場合はMutex辺りでプロセス間で排他もしないとダメでしょう。
でもほんとはファイル分けた方が無難だと思いますけどね。

引用返信 編集キー/
■11953 / inTopicNo.3)  Re[2]: Synchronizedについて
□投稿者/ 囚人 (272回)-(2007/12/26(Wed) 10:36:35)
同一プロセスの複数スレッドからの排他制御であればスレッドセーフにすればよいですが、複数プロセスからのアクセスは別対処です。

その複数プロセスが全部自作であれば、ファイルを開くときに共有モードのレベルをゆるめにしておき、後続のプロセスがファイルを開けるようにしておきます。

FileStream fs = new FileStream("aaaa.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite);

で書き込む前に実際にロック
fs.Lock(0, 1); // 数値は適当

ですが、この Lock メソッドはロックを獲得できなければ例外を出します。ロック解除を待ちたければ Win32 API の LockFileEx を DllImport して使います。

複数プロセスが自作でない、つまり自分の力が及ばない範囲であれば、先にファイルを開いたプロセスがどういう共有モードで開いているのか分からない限り、ファイルを開けるまでポーリングするしかなんじゃないでしょうか(他に良い方法があるかもしれませんが)。

引用返信 編集キー/
■11956 / inTopicNo.4)  Re[3]: Synchronizedについて
□投稿者/ makoto (2回)-(2007/12/26(Wed) 11:05:40)
なちゃさん、囚人さんお返事ありがとうございます。
囚人さんの言われた方法でやろうと思ったのですが、
かなり手の込んだものになりそうなので(バグを作りこみそう)
プロセスごとにファイルを分けます。



解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -