2010-11-17 80 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