作者热门文章
- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
根据我的阅读,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
如果你的编译器支持这个。
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/
我是一名优秀的程序员,十分优秀!