线程中的线程

时间:2013-04-18 05:43:52

标签: c++ thread-safety

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

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();
    });
}

或者将线程保留为main更好。我首先要关注的是线程是否唯一(因此,如果我使用两个不同的文件将类实例化2次,则会覆盖thread_log或发生冲突)。

1 个答案:

答案 0 :(得分:2)

在课堂上有一个专用线程没有错,但我想注意几件事:

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

  2. 需要提供终止日志记录线程的可能性。您可以通过在循环中检查“终止”变量,或者通过向记录器发送特殊的“毒丸”消息来实现更高的目标。