【发布时间】:2012-03-25 17:48:02
【问题描述】:
根据我的阅读,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 是一个布尔值。
我一直在我的主应用程序中使用这个小函数没有问题,但我现在想将它的使用扩展到一些子线程。这些线程会工作并在工作完成时异步打印数据。
问题:如何向这个例程添加简单的行级线程安全?我真正关心的是进入的每一行在我的日志中保持不变。在这种情况下,性能不是问题,但(一如既往)更快更好。
我知道我可以使用第三方日志记录包,但我想自己做,以便了解它的工作原理。我的多线程知识不是应有的水平,我正在努力提高这一点。
我听说过critical sections 一词,并且我对互斥锁和信号量有所了解,但在这种情况下我会使用哪个?有没有干净、简单的解决方案?提前感谢您的任何建议。
【问题讨论】:
标签: c++ windows multithreading thread-safety iostream