2010-11-17 112 views
2

我已经重载了<<运算符,以便它可以写入文件并在控制台上写入。我已经创建了8个线程,以相同的功能,我想输出将数据打印到文件

hello 
    hi 

如果我在一个无限循环中运行此线程程序文件中的O/P是

你好

你好

你好

ELLO

你好

你好

LLO

你好

这有没有图案。问题是什么?我能够在控制台上正确打印它,但不能将其打印到文件中。

+1

你能告诉我们一些代码吗? – birryree 2010-11-17 06:27:26

+1

如果你只是天真地创建几个线程,并开始喷射输出,那么它的顺序就没有任何保证。 – Cascabel 2010-11-17 06:28:53

+0

Thx回答接受。 – 2010-11-24 21:04:12

回答

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代码 - 这只是一个例子,还有其他的事情很多的心中有,仅举几个:

  • 您的粒度可能会有所不同,我用这里的行
  • 您可能想要使用出列<>或某些类似的FIFO结构
  • 您可能想要WaitForSingleObject(),而不是Sleep() -ing有病例更好的控制,当你想停止
  • 的东西创建单独的对象,并用它在你需要它(我猜你正在创建某种日志工具的?)
+0

对于上帝的爱,你可以评论而不是 - 1我? – 2010-11-17 09:48:53

+0

不是我的-1,但是当之无愧。睡眠(100)?线程安全?缓冲区溢出?不受保护的共享变量访问?有很多原因可以降低这一点。 – MSalters 2010-11-19 15:47:08

+0

我在评论中解决了所有这些问题。变量访问:关键部分。睡眠 - 使用WaitForSingleObject。嗯... – 2010-11-19 17:51:00

4

当您将数据发送到流时是否锁定互斥锁? C++流类不是线程安全的。

+0

当我使用互斥锁来锁定... o/p是正确的...为什么我得到这个概率,如果我不锁定互斥锁? – Manu 2010-11-17 06:34:08

+0

@Manu:你为什么认为这是一个“问题?” – 2010-11-17 06:34:47

+0

你开始做8个线程做同样的事情。他们都在同一时间做同样的事情。为什么你会期望除了你看到的东西以外的其他东西 – 2010-11-17 06:35:18

0

其实你有一个线程之间的同步问题。

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

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

这样,两个不同的线程不能同时使用的功能。

+0

这是有点超过顶部。 'ostream'用于格式化输出。格式化可以在每个线程上并行完成;你只需要同步输出部分。 – MSalters 2010-11-17 09:24:26

+0

@ MSalters:这是一个很好的观点。但我同意你的看法,但你仍然需要小心一些。操纵器std :: endl将刷新需要被锁定的osteam缓冲区的内容(或者当缓冲区内容将被刷新到文件中时需要手动控制) – Phong 2010-11-18 08:30:26