我正在尝试编写一个非常简单的线程安全记录器。理想情况下,我希望它像 一样工作std::cout
,您可以只重载<<
运算符,然后让所有内容神奇地显示在日志中。我在 Windows 机器上,所以这是我尝试的方法:
// Threadsafe logger
class Logger
{
public:
Logger()
{
InitializeCriticalSection(&s);
}
~Logger()
{
DeleteCriticalSection(&s);
}
void Log(std::ostream const& os)
{
EnterCriticalSection(&s);
//std::cout << static_cast<std::stringstream const&>(os).str();
std::cout << os.rdbuf();
LeaveCriticalSection(&s);
}
private:
CRITICAL_SECTION s;
};
请注意,我已经尝试了两种方法来实现该Log()
功能。我接受 an 的原因ostream
是因为这stringstream
似乎<<
是在调用运算符之后产生的。当我运行此代码时,该函数的两种变体Log()
都以相同的方式失败:
#include <iostream>
#include <sstream>
#include <Windows.h>
int main(int argc, char* argv[])
{
Logger logger;
//logger.Log(std::stringstream("Test"));
logger.Log(std::stringstream("Another ") << "test");
std::cin.get();
}
使用 Log 函数的两种变体输出第一行(“测试”)可以正常工作并正确显示。第二行输出一个错位的输出:
testher
这显然是test
写在上面Another
。我对这些流的工作方式缺少什么?我试着flush
打电话希望能解决问题,但它什么也没做。
如何在线程安全记录器上尝试与流一起正常工作?