所以我有多個線程通過調用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下)是一個非常昂貴的操作 - 考慮將日誌記錄類更改爲單例,並且只打開一次文件。 –
考慮使用第三方日誌記錄庫 – ZivS