我正在开发一个多线程 c++ 应用程序,实际上我正面临由并发线程调用cout
/引起的交错控制台输出问题cerr
。注意:我不能使用 boost/QT/其他框架,只能使用标准 c++。
作为临时修复,我正在使用此类:(实际上这是一个 win32 代码片段,这就是使用 CRITICAL_SECTION 作为临时解决方法的原因);
class SyncLogger
{
public:
SyncLogger() { InitializeCriticalSection(&crit); }
~SyncLogger() { DeleteCriticalSection(&crit); }
void print(std::ostringstream &os) {
EnterCriticalSection(&crit);
std::cout << os.str();
os.str(""); // clean stream
LeaveCriticalSection(&crit);
}
private:
CRITICAL_SECTION crit;
};
用法如下:
...
ostringstream ss;
ss << "Hello world, I'm a thread!" << endl;
syncLogger.print(ss);
我认为这很丑陋,但它似乎有效。
顺便说一句,感谢另一个问题(向 std::cout 添加“提示”消息的最佳方式)我创建了以下日志记录类:
class MyLogger
{
std::ostream & out;
std::string const msg;
public:
MyLogger(std::ostream & o, std::string s)
: out(o)
, msg(std::move(s))
{ }
template <typename T>
std::ostream & operator<<(T const & x)
{
return out << msg << x;
}
};
那么,是否存在一种在类中提供内置锁定的方法MyLogger
(使用临界区或 win32 互斥锁)?我最大的愿望是任何线程都能够以同步方式打印消息,只需使用
myLog << "thread foo log message" << endl;
并且不需要ostringstream
每次都创建一个对象。
提前致谢。