2009-11-11 175 views
2

我寫了一些數據到管道 - 可能是很多數據和隨機間隔。如何從管道讀取數據?多線程:讀取/寫入管道

這是確定:

    在主線程
  • (當前進程)創建兩個以上線程(2,3)
  • 第二線程有時寫入管道(和flush-ES管道? )
  • 第三線程具有無限循環讀取管道(然後睡了一段時間)

這是到目前爲止,正確嗎?

現在,有一些事情我不明白:

  • 我必須鎖(互斥?)上寫管道?
  • IIRC,當寫入管道及其緩衝區已滿時,寫入結束會阻塞,直到我讀取已寫入的數據,對吧?如何檢查管道中的讀取數據,不要太頻繁,不要太少?所以第二個線程不會阻止?有沒有像select管道?
  • 可以將管道設置爲無緩衝區,或者我必須定期刷新它 - 哪一個更好?
  • 我應該多創建一個線程,只是爲了在寫入後刷新管道?因爲沖洗塊,以及緩衝區已滿,對吧?我只是不想在第一和第二線程阻塞....

[編輯] 對不起,我想這個問題是平臺無關,但以防萬一:我是從Win32的角度看這個可能MinGW的ç...

+1

這些都是很好的問題。如果你將自己的問題分解出來並提供你正在考慮的方法的代碼片段,你會得到更好的迴應。另外,你沒有提到有關語言或平臺的任何信息。 – 2009-11-11 03:28:58

+0

同意凱利。我們需要更多的信息。所有這些問題都可以有平臺和語言特定的答案。另外,您打算用於「管道」的數據結構將是有用的信息。 – 2009-11-11 23:31:57

+0

哦,對不起,我認爲平臺並不那麼重要,因爲我認爲這個問題與技術有關。但我只是更新了這個問題,謝謝你的建議。什麼樣的數據結構,只有緩衝區,這只是一個數組...。 – 2009-11-12 00:09:36

回答

2

我不會回答你所有的問題在這裏,因爲有很多人,但在回答:

我必須鎖管(互斥?)寫上?

這個問題的答案是平臺特定的,但在大多數情況下,我會猜測是的

這涉及到管道上的寫入/讀取操作是否爲原子。如果的讀數爲寫入操作是非原子操作(很可能是寫操作),那麼您需要在寫入和讀取時鎖定管道以防止競爭條件。

例如,可以說在管道上寫入編譯成機器代碼2說明:

INSTRUCTION 1 
INSTRUCTION 2 

比方說,如果你把這些2個指令和你閱讀線程試圖之間的線程上下文切換讀取處於中間狀態的管道。這可能會導致崩潰或(更糟糕的)數據損壞,這些數據損壞通常會在代碼中的其他位置出現崩潰。這通常是由於競爭條件而產生的,這些條件通常是非確定性的並且難以診斷或再現。

一般來說,除非您可以保證所有線程都將使用原子指令集訪問共享資源,否則必須使用互斥鎖或臨界區域

+0

當管道操作系統序列化時,對管道的'write()'對於短消息是安全的。如果你依賴於這個,強烈建議**只使用長度爲2的小功率的消息(即,可以正好整除成一個內存頁面),這樣寫入就不會停止,書面信息。 – 2010-05-13 08:07:42