这段代码是一个简单的日志记录器实现,使用C++语言编写。但是在多线程环境下存在潜在的线程安全问题。要使其线程安全,可以考虑使用互斥锁来保护关键代码段。
具体步骤如下:
- 在Log类中添加一个私有成员变量
std::mutex m_mutex;
用于实现互斥锁。 - 在log()函数的适当位置上锁
m_mutex.lock()
,并在需要解锁的地方解锁m_mutex.unlock()
,确保关键代码段只能被一个线程执行。 - 确保open()和close()函数也受到相同的互斥保护,以防止多个线程同时访问文件。
修改后的代码片段如下所示:
void CFX::Logger::Log::open(const string & filename)
{
std::lock_guard<std::mutex> lock(m_mutex); // 加锁
// ...
}
void CFX::Logger::Log::close()
{
std::lock_guard<std::mutex> lock(m_mutex); // 加锁
// ...
}
void CFX::Logger::Log::log(Level level, const char * file, int line, const char * format, ...)
{
std::lock_guard<std::mutex> lock(m_mutex); // 加锁
if (m_level > level) {
return;
}
// ... 其他日志逻辑
m_fout << "\n";
m_fout.flush();
if (m_len >= m_max && m_max > 0) {
rotate();
cout << "传入" << endl;
}
// 解锁
// lock_guard 在作用域结束时会自动解锁,无需手动解锁
}
这样修改后的代码会在关键部分加锁,确保多个线程不能同时执行敏感操作,从而保证了线程安全性。
内容由零声教学AI助手提供,问题来源于学员提问