gpt4 book ai didi

c++ - 将线程安全添加到简单的日志记录功能?

转载 作者:可可西里 更新时间:2023-11-01 14:45:37 25 4
gpt4 key购买 nike

根据我的阅读,standard output streams are generally not thread safe .我有一个 C++ 应用程序(基于 Windows,使用 Visual Studio 2005),它具有非常简单的日志记录功能:

void logText(string text)
{
if(g_OutputLogEnabled && g_OutputLog.is_open())
{
string logDate = getDateStamp("%Y-%m-%d %H:%M:%S");
g_OutputLog << "[" << logDate << "]: " << text << endl;
}

cout << text << endl; // Also echo on stdout
}

在这个例子中,g_OutputLog 是一个 ofstream 而 g_OutputLogEnabled 是一个 bool 值。

我一直在我的主应用程序中使用这个小函数没有问题,但我现在想将它的使用扩展到一些子线程。这些线程确实工作并在工作完成时异步打印数据。

问题:如何向该例程添加简单的行级线程安全?我真正关心的是输入的每一行在我的日志中都保持完整。在这种情况下,性能不是问题,但(一如既往)越快越好。

我知道我可以使用第三方日志包,但我想自己做,这样我就可以了解它是如何工作的。我的多线程知识达不到应有的水平,我正在努力提高这一点。

我听说过 critical sections 这个词,而且我有点了解互斥量和信号量,但在这种情况下我会使用哪个?有干净、简单的解决方案吗?在此先感谢您的任何建议。

最佳答案

使用作用域锁,例如:

void logText(string text)
{
if(g_OutputLogEnabled && g_OutputLog.is_open())
{
string logDate = getDateStamp("%Y-%m-%d %H:%M:%S");

boost::scoped_lock (g_log_mutex); //lock
g_OutputLog << "[" << logDate << "]: " << text << endl;

} //mutex is released automatically here

boost::scoped_lock (g_cout_log_mutex); //lock on different mutex!
cout << text << endl; // Also echo on stdout
}

或者您可以使用 std::unique_lock如果你的编译器支持这个。


如果您不能使用 Boost 并且没有 std::unique_lock,您将如何实现 scoped_lock

首先定义mutex类:

#include <Windows.h>

class mutex : private CRITICAL_SECTION //inherit privately!
{
public:
mutex()
{
::InitializeCriticalSection(this);
}
~mutex()
{
::DeleteCriticalSection(this);
}
private:

friend class scoped_lock; //make scoped_lock a friend of mutex

//disable copy-semantic
mutex(mutex const &); //do not define it!
void operator=(mutex const &); //do not define it!

void lock()
{
::EnterCriticalSection(this);
}
void unlock()
{
::LeaveCriticalSection(this);
}
};

然后将scoped_lock定义为:

class scoped_lock
{
mutex & m_mutex;
public:
scoped_lock(mutex & m) : m_mutex(m)
{
m_mutex.lock();
}
~scoped_lock()
{
m_mutex.unlock();
}
};

现在您可以使用它们了。

关于c++ - 将线程安全添加到简单的日志记录功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9862485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com