ブーストスレッドライブラリを使用して、開いている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の両方で機能するソリューションが欲しいのですが。私の直感は、ファイル参照を渡し、各スレッドをファイルに追加させることです。