我已經重載了<<
運算符,以便它可以寫入文件並在控制檯上寫入。我已經創建了8個線程,以相同的功能,我想輸出將數據打印到文件
hello
hi
如果我在一個無限循環中運行此線程程序文件中的O/P是
你好
喜
你好
喜
你好
喜
ELLO
我
你好
喜
你好
喜
LLO
我
你好
喜
這有沒有圖案。問題是什麼?我能夠在控制檯上正確打印它,但不能將其打印到文件中。
我已經重載了<<
運算符,以便它可以寫入文件並在控制檯上寫入。我已經創建了8個線程,以相同的功能,我想輸出將數據打印到文件
hello
hi
如果我在一個無限循環中運行此線程程序文件中的O/P是
你好
喜
你好
喜
你好
喜
ELLO
我
你好
喜
你好
喜
LLO
我
你好
喜
這有沒有圖案。問題是什麼?我能夠在控制檯上正確打印它,但不能將其打印到文件中。
創建一個隊列並寫入它。以期望的粒度出隊隊列 - 例如一行(我想這就是你想要的例子)。
喜歡的東西:
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代碼 - 這只是一個例子,還有其他的事情很多的心中有,僅舉幾個:
WaitForSingleObject()
,而不是Sleep()
-ing有病例更好的控制,當你想停止對於上帝的愛,你可以評論而不是 - 1我? – 2010-11-17 09:48:53
不是我的-1,但是當之無愧。睡眠(100)?線程安全?緩衝區溢出?不受保護的共享變量訪問?有很多原因可以降低這一點。 – MSalters 2010-11-19 15:47:08
我在評論中解決了所有這些問題。變量訪問:關鍵部分。睡眠 - 使用WaitForSingleObject。嗯... – 2010-11-19 17:51:00
當您將數據發送到流時是否鎖定互斥鎖? C++流類不是線程安全的。
當我使用互斥鎖來鎖定... o/p是正確的...爲什麼我得到這個概率,如果我不鎖定互斥鎖? – Manu 2010-11-17 06:34:08
@Manu:你爲什麼認爲這是一個「問題?」 – 2010-11-17 06:34:47
你開始做8個線程做同樣的事情。他們都在同一時間做同樣的事情。爲什麼你會期望除了你看到的東西以外的其他東西 – 2010-11-17 06:35:18
其實你有一個線程之間的同步問題。
例如有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()
這樣,兩個不同的線程不能同時使用的功能。
你能告訴我們一些代碼嗎? – birryree 2010-11-17 06:27:26
如果你只是天真地創建幾個線程,並開始噴射輸出,那麼它的順序就沒有任何保證。 – Cascabel 2010-11-17 06:28:53
Thx回答接受。 – 2010-11-24 21:04:12