따라서 Log :: write 메서드를 호출하여 동일한 파일에 쓰는 여러 스레드가 있습니다.
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 메서드를 동시에 호출해도 안전합니까?
코드는 낭비 적이며 C ++ 관용구를 따르지 않습니다.
끝부터 시작 : 예, write
win32 CRITICAL_SECTION
는 동시 수정으로부터 보호 하므로 스레드로부터 안전 합니다.
이기는 하지만:
매번 스트림을 열고 닫는 이유는 무엇입니까? 이것은 매우 낭비적인 일입니다. 생성자에서 스트림을 열고 열어 둡니다. 소멸자는 스트림 닫기를 처리합니다.
Win32 중요 섹션을 사용하려면 적어도 RAII를 안전하게 만드십시오. 중요 섹션에 대한 참조를 래핑하고 생성자에서 잠그고 소멸자에서 잠금을 해제하는 클래스를 만듭니다. 이렇게하면 예외가 발생하더라도 잠금이 해제됩니다.
CriticalSection
어쨌든 감속은 어디 입니까? 의 구성원이어야합니다 Log
.
알고 std::mutex
계십니까?
값으로 문자열을 전달하는 이유는 무엇입니까? 매우 비효율적입니다. 그런 다음 const 참조로 전달하십시오.
일부 변수 ( file_path
) 에는 snake_case를 사용 하고 다른 변수 에는 대문자 camel ( CriticalSection
)을 사용합니다. 동일한 규칙을 사용하십시오.
str
문자열 변수에 대한 좋은 이름이 아니며 파일 스트림은 로그가 아닙니다. 실제 로깅을 수행하는 것입니다. logger
더 나은 이름입니다. 내 수정에서 그냥 이름이 지정됩니다 m_file_stream
.
수정 된 코드 :
class Log
{
private:
std::mutex m_lock;
std::ofstream m_file_stream;
std::string m_file_path;
public:
Log(const std::string& file_path);
void write(const std::string& log);
};
Log::Log(const std::string& file_path):
m_file_path(file_path)
{
m_file_stream.open(m_file_path.c_str());
if (!m_file_stream.is_open() || !m_file_stream.good())
{
//throw relevant exception.
}
}
void Log::write(const std::string& log)
{
std::lock_guard<std::mutex> lock(m_lock);
m_file_stream << log << '\n';
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다