一般来说,我假设流不同步,由用户做适当的锁定.但是,做cout标准库中的特殊处理吗?
也就是说,如果多个线程正在写入,cout它们会破坏cout对象吗?据我所知,即使同步,你仍然会得到随机交错的输出,但保证交错.也就是说,cout从多个线程使用是否安全?
该供应商是否依赖?gcc做什么?
重要提示:如果您说"是",请为您的答案提供某种参考,因为我需要某种证明.
我关注的还不是基础系统调用,这些都很好,但是流在顶部添加了一层缓冲.
从我读到的,标准输出流通常不是线程安全的.我有一个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
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,g_OutputLog是一个ofstream并且g_OutputLogEnabled是一个布尔值.
我一直在我的主应用程序中使用这个小函数没有问题,但我现在想将其用途扩展到一些子线程.这些线程在工作完成后可以工作并异步打印数据.
问题:如何在此例程中添加简单的行级线程安全性?所有我真正关心的是,我的日志中的每一行都保持不变.在这种情况下,性能不是问题,但(一如既往)更快更好.
我知道我可以使用第三方日志包,但我想自己做,所以我可以学习它是如何工作的.我的多线程知识不应该是它应该是什么,我正在努力改进它.
我听过关键部分一词,我有点意识到互斥锁和信号量,但在这种情况下我会使用哪些?有一个干净,简单的解决方案吗?提前感谢任何建议.