1

我正在创建一个将字符串记录到文件中的异步类。我应该在类本身中创建线程吗?我在想这样的事情作为启动功能

void Async_Log::start (void)
{
  std::thread thread_log(
    [&]()
    {
      std::ofstream fout;
      fout.open(fileName);
      while(true)
      {
        if(q.size())
        {
          std::lock_guard<std::mutex> lock(m);
          fout << q.front() <<  "\t At Time: " << std::clock() << std::endl;
          q.pop();
        }
      }
      fout.close();
    });
}

或者将线程留在主线程会更好。我首先关心的是线程是否是唯一的(所以如果我用两个不同的文件实例化类 2 次,thread_log 会被覆盖或发生冲突)。

4

1 回答 1

2

在课堂上有一个专门的线程没有错,但我想注意几点:

  1. 在您的线程中,您实现忙于等待日志消息。这是完全多余的而且非常昂贵!即使队列中没有消息,您的线程也会消耗 CPU。你需要的是阻塞队列,这会阻塞 pop() 方法。您可以在此处此处找到 C++ 阻塞队列的实现。

  2. 需要提供终止日志记录线程的可能性。您可以通过在循环中检查“终止”变量或向记录器发送特殊的“毒丸”消息来完成此操作。

于 2013-04-18T06:25:21.020 回答