将数据打印到文件

时间:2010-11-17 06:25:18

标签: c++ multithreading

我已经重载了<<运算符,以便它写入文件和控制台。我已经为同一个函数创建了8个线程,我想输出

 hello
  hi

如果我在无限循环中运行此线程例程,则文件中的o / p为

您好

你好

您好

ELLO

您好

您好

LLO

您好

这没有模式。问题是什么?我可以在控制台上正确打印它,但不能打印到文件中。

3 个答案:

答案 0 :(得分:4)

在将数据发送到流时,是否锁定了互斥锁? c ++流类不是线程安全的。

答案 1 :(得分:2)

创建一个队列并写入它。以所需的粒度出列队列 - 例如一行(我猜这就是你想要的例子)。

类似的东西:

CRITICAL_SECTION cs;
list<string> _queue;
void Write(string line) 
{
    EnterCriticalSection(&cs);
    _queue.push_back(line); 
    LeaveCriticalSection(&cs);
}
ThreadProc()
{
    while (!_shouldStop)
    {
        Dequeue();
        Sleep(100);
    }
}
void Dequeue()
{
    EnterCriticalSection(&cs);
    if (!_queueIsEmpty()) 
    {
         string line=_queue.front(); 
         _queue.pop_front();
         stream << line;
    }
    LeaveCriticalSection(&cs);
}

这不是C代码 - 这只是一个例子,还有很多其他的东西需要考虑,仅举几例:

  • 您的粒度可能会有所不同,我在这里使用了
  • 你可能想要使用dequeue&lt;&gt;或类似的一些FIFO结构
  • 您可能希望WaitForSingleObject()代替Sleep() - 在您想要停止时更好地控制案件
  • 为这些东西创建单例对象并在需要的地方使用它(我想你正在创建某种日志工具?)

答案 2 :(得分:0)

实际上你在线程之间存在同步问题。

例如2个线程:(字符串的cout用“print”字符表示)。

thread1  thread2
print h
print e 
print l
         print h
print l
print o
         print e

print \n
         print l
         print l
         print o
         print \n

结果将是:

helhloe
llo

你需要确保两个线程不同时使用你的功能。

function_cout_hello()
  lock()
  file << ...
  unlock()
就像那样,两个不同的线程不能同时使用该功能。