したがって、Log :: writeメソッドを呼び出すことで、同じファイルに複数のスレッドを書き込んでいます。C++:マルチスレッドプログラムのファイルに書き込む
class Log
{
private:
ofstream log;
string file_path;
public:
Log(string);
void write(string);
};
Log::Log(string _file_path)
{
file_path=_file_path;
}
void Log::write(string str)
{
EnterCriticalSection(&CriticalSection);
log.open(file_path.c_str(),std::ofstream::app);
log<<str+'\n';
log.close();
LeaveCriticalSection(&CriticalSection);
}
スレッドが同じオブジェクトのLog :: writeメソッドを同時に呼び出すのは安全ですか?
はい。 RAIIを使用してクリティカルセクションのロック/ロック解除を検討し、例外を安全にしてください。 C++の標準ロックの使用を検討してください。別のロギングスレッドとメッセージキューを使用して、ロッキングボトルネックを小さくすることを検討してください。 MS Windows上のファイルを開くことは、非常に高価な操作です - ロギングクラスをシングルトンに変更し、一度だけファイルを開くことを検討してください。 –
3rdpartyロギングライブラリの使用を検討する – ZivS