我一直在编写一个基于 RAII 的 C++ 方法入口/出口记录器。用法是这样的:
void Class::Method()
{
METHOD_NAME( "Class::Method" ); // I know: I could use __FUNCTION__ instead ;<)
…
}
记录器类:
#define METHOD_NAME(name) TraceLogger _traceLog(name);
TraceLogger::TraceLogger( const std::string& theContext )
{
<lock mutex here>
// Trace logging code here
}
TraceLogger::~TraceLogger()
{
<lock mutex here>
// Trace logging code here
}
问题是代码不是线程安全的。如果我在此处添加互斥体来保护代码,它是否会被正确使用,因为它将被构造然后立即在 TraceLogger 构造函数中使用?
我们是一个 Windows VS2008 商店(即没有可用的 std::mutex),并且正在使用自制的线程锁定代码。我尝试过使用这个,但似乎不起作用。
有没有标准的方法可以做到这一点?
谢谢,
保罗
使用使用工作线程类封装的基于无锁队列的结构。所有应用程序线程都会将日志字符串放入对象队列中。工作线程将扫描队列并将数据记录到文件中。使工作线程在队列为空时阻塞。
在 C++ 并发演讲 Herb Sutter 中对此进行了如下描述:
记录器采用可以记录字符串的 lambda。工作线程有一个 lambda 队列,并将串行执行 lambda。
class log
{
fstream f;
worker_thread w;
public:
void println( /*…*/ )
{
w.send([=]{f << /*…*/ << endl;
});}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)