2013-03-08 27 views
0

使用boost線程庫我將打開的ofstream文件作爲參考傳遞給每個線程,線程寫入一半後出現某種崩潰,程序終止。我的假設是函數到達最後,關閉文件,剩下的線程試圖寫入一個關閉的文件。作爲測試,我爲最後一個線程和更多被管理寫入文件的線程添加了連接語句。我的體驗muttread是2天 - 昨天我得到了boost庫,並沒有更多的經驗在c + +或任何語言。ofstream從多個boost線程寫入 - g ++和vs2008

我閱讀了「可能已經有答案的問題」,但沒有回答這個問題。有很多帖子可以解決這個問題的版本,並且解決方案的方法也很多 - 看起來更像是過度使用,並且有一種乾淨的方法可以確保在文件關閉之前所有線程都已完成,並且每個線程的寫入都是緩衝在隊列中以防止寫入衝突。

一些可能的解決方案:

  • 而不是通過打開的文件,通過該文件參考,並讓每個線程 打開文件,追加,並關閉ofstream myfile("database", ios::out | ios::app); - 從這個發佈解決方案"How do I add...";這並不工作

  • 讀通過boost thread documentation,有一個 join_all()功能,但是從升壓1.53.0 版本在VS2008編譯,"error C2039: 'join_all' : is not a member of 'boost::thread'"

  • Use boost mutex or locks這個解釋好像它是 asnwer,但我首先想知道崩潰是由於多個 寫衝突或在線程完成寫入之前關閉文件。

  • c++ ostream::write page引用的多線程,而只是 狀態,有沒有保證

  • This one states一些關於boost::thread and boost::function一樣,沒有其他工作,但審查 boost::function文獻沒有幫助解釋什麼評論 意味着

  • 返回到如果這是等待所有主題完成 而不是寫入衝突的問題,this discussion provides a solution即 需要存儲的所有線程,並調用join()

  • This discusses the窗口具體WaitForMultipleObjects但 這是由於Windows的具體 - 在這篇文章的最後解決方案聽起來像 的答案,但它沒有票,我不能告訴如果是Windows 具體與否。

  • Buffer everything to memory並在一個單獨的函數中寫出 - 這個解決方案在C#中,但這種方法似乎是合理的。他們討論的細節對我來說沒有意義。

  • create threads in a loop - 似乎有最清晰的評論;使用這個線程給出boost::thread_group方法

  • 還有更多的論壇討論,但他們聽起來像多個版本的前面的例子

我想,在Windows和Linux有效的解決方案來解決;我的直覺就是傳遞文件引用並讓每個線程追加到文件中。

回答

1

從多個線程到同一個流的不協調寫入後,您期望看到什麼結果?畢竟,這將是垃圾,即使這個流確實存在這種折磨......你需要在寫作之間實現某種協調。

+0

是的,這正是我所期望的,也是大多數解決方案所處理的內容,但在崩潰之外,從多個線程寫入文件的數據是正確的 - 只是幸運的;我想也許thestream序列化與寫入內置緩衝區功能。 – 2013-03-08 19:51:05

+0

這是可能的,但不太可能。無論如何,這不是規範的一部分,我不會依賴這一點。 – 2013-03-08 19:55:42