異なるスレッドからの詰まりを避ける簡単な方法は?
-
27-10-2019 - |
質問
私は、2つの別々のスレッドがSTD ::詰まりにデバッグ出力を送信し、出力が散在するマルチスレッドプログラムを持っています。出力のラインフィードを除き、少なくとも分離するように出力を強制する簡単な方法を見つけたいと思います。これにより、デバッグ出力はより簡単に解釈できます。いくつかの場所では、出力の前に睡眠を挿入し、衝突の可能性を減らすために詰まって出力を送信する前に出力を集めましたが、より堅牢で確実な解決策を好みます。
他のスレッドが入力して独自の出力を書くことができる前に、各スレッドがSTD ::詰まりに一度に全体を書くことを保証する簡単な方法はありますか?
解決
これを行うための特に簡単な方法はありません。ここでは、拡張された議論があります。 http://www.cplusplus.com/forum/general/27760/
問題は、新しいものを作成することでそこでやや解決されます AtomicStream
これは、他のものがストリーミングされる前に、線全体を原子的に書き込みます(これはバッファリングトリックで行われます)。同様のソリューションを考え出す必要があります。イエサイの答えは申し訳ありません - スレッドの同期は、どういうわけかあなたのソリューションにそれを作らなければなりません。
これは派生的かもしれませんが、あなたの場合 std::clog
ファイルにリダイレクトすると、複数のスレッドの複数のファイルがあることもあります。
他のヒント
できません。あなたは同じストリームに同時に書いています。バッファリング clog
少し役立ちますが、まだ保証はありません。
スレッドのロギングを同期したい場合を除き(していることに対してちょっと高価です)、代わりにロギング機能を使用することを検討する必要があります(これにより、異なるもののために異なるファイルを記録することができます)。
ええ、あなたはクロススレッド同期方法を探しています。これらは通常、オペレーティングシステムのAPIで利用できますが、ブーストのAPIも見つけることができます。