0

ブーストスレッドライブラリを使用して、開いているofstreamファイルを参照として各スレッドに渡します。スレッドの半分が書き込まれた後、何らかのクラッシュが発生し、プログラムが終了します。私の仮定は、関数が最後に到達し、ファイルを閉じ、残りのスレッドが閉じたファイルに書き込もうとしていることです。テストとして、最後のスレッドに結合ステートメントを追加し、さらに多くのスレッドがファイルに書き込むことができました。私のマルチスレッドの経験は2日です-昨​​日私はブーストライブラリを構築しましたが、C++や他の言語での経験はそれほど多くありません。

「すでにあなたの答えがあるかもしれない質問」を読みましたが、誰もこの質問に答えません。この問題のバージョンに対処する投稿が非常に多く、解決策へのアプローチも同じです。これは考えすぎのようで、ファイルが閉じる前にすべてのスレッドが終了し、各スレッドからの書き込みが完了していることを確認するクリーンな方法があります。書き込みの衝突を防ぐためにキューにバッファリングされます。

いくつかの可能な解決策:

  • 開いているファイルを渡すのではなく、ファイル参照を渡し、各スレッドにファイルを開いて追加し、閉じさせますofstream myfile("database", ios::out | ios::app);-この投稿されたソリューションから「追加するにはどうすればよいですか...」 ; これはうまくいきませんでした

  • ブーストスレッドのドキュメントを読むと、 join_all()関数がありますが、ブースト1.53.0バージョンからvs2008でコンパイルされています。"error C2039: 'join_all' : is not a member of 'boost::thread'"

  • ブーストミューテックスを使用するか、ロックします。この説明は答えのようですが、最初に、クラッシュが複数の書き込みの競合によるものなのか、スレッドが書き込みを完了する前にファイルが閉じたものなのかを知りたいと思います。

  • このc++ostream :: writeページはマルチスレッドを参照していますが、保証がないことを示しているだけです

  • これboost::thread and boost::functionは他に類を見ない仕事 について何かを述べていますが、boost::function文献をレビューすることはコメントが何を意味するかを説明するのに役立ちませんでした

  • これが書き込みの衝突ではなく、すべてのスレッドが完了するのを待つことに関する問題である場合に戻って、この議論は、すべてのスレッドを保存し、呼び出すことを必要とする解決策を提供しますjoin()

  • これはウィンドウ固有について説明していますWaitForMultipleObjectsが、これはウィンドウ固有です-この投稿の最後の解決策は答えのように聞こえますが、投票がなく、ウィンドウ固有かどうかはわかりません。

  • すべてをメモリにバッファリングし、別の関数で書き出す-このソリューションはC#ですが、このアプローチはもっともらしいようです。彼らの議論の詳細は私には意味がありません。

  • ループ内にスレッドを作成する-最も明確なレビューがあるようです。boost::thread_groupこのスレッドで与えられた方法を使用して解決

  • より多くのフォーラムディスカッションがありますが、前の例のより多くのバージョンのように聞こえます

WindowsとLinuxの両方で機能するソリューションが欲しいのですが。私の直感は、ファイル参照を渡し、各スレッドをファイルに追加させることです。

4

1 に答える 1

1

複数のスレッドから同じストリームへの調整されていない書き込みの後、どのような結果が予想されますか? たとえストリームがこの拷問を生き延びたとしても、それは結局のところゴミになります... 書き込み間の何らかの調整を実装する必要があります。

于 2013-03-08T19:42:31.910 に答える