2013-04-18 55 views
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被覆蓋或發生衝突)。

+0

通過定義一個GUID成員,可以爲不同的類寫入不同的文件。 – 2013-04-18 05:59:15

+0

在班上有一個線程沒什麼問題。但是你需要提供一種手段來加入它。 – juanchopanza 2013-04-18 06:00:13

+0

就像添加一個停止功能,將打破循環,然後加入線程回來? – 2013-04-18 06:02:12

回答

2

沒有什麼錯在類專用線程是的,但我要指出的幾件事情:

  1. 你的線程您實現忙等待的日誌信息裏面。這是完全多餘的,非常昂貴!即使隊列中沒有消息,線程也會消耗CPU。你需要的是阻塞隊列那裏,這將阻止pop()方法。您可以找到C++ herehere的阻塞隊列的實現。

  2. 有必要提供終止您的日誌記錄線程的可能性。這可以通過在循環中檢查'終止'變量,或者通過向記錄器發送特殊的「毒藥」消息來完成。