2

我一直在编写基于 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 ),并且正在使用自制的线程锁定代码。我试过用这个,它似乎不起作用。

有什么标准方法可以做到这一点吗?

谢谢,保罗

4

1 回答 1

1

使用使用工作线程类封装的基于无锁队列的结构。所有应用程序线程都会将日志字符串放入对象队列中。工作线程将扫描队列并将数据记录到文件中。使工作线程在队列为空时阻塞。

在 C++ 并发演讲中,Herb Sutter 将其描述如下:

记录器采用可以记录字符串的 lambda。工作人员有一个 lambda 队列,并将连续执行 lambdas。

class log 
{
  fstream f;
  worker_thread w;

  public:
   void println( /*…*/ ) 
   {
      w.send([=]{f << /*…*/ << endl;
   });}

};
于 2013-04-10T10:41:46.073 回答