非同期ログを扱っている場合は、スレッドセーフ キューを使用して、タイムスタンプ付きのすべてのメッセージをログ スレッド ワーカーに送り込むことをお勧めします。ロギング ワーカーは、ブロック内のすべてのメッセージがキューに表示されるときに処理できます。
このスレッド セーフなキューの抽象化により、バッファー サイズを設定するか、または無制限のままにしておくことができます (条件変数を介してキュー/バッファーがいっぱいになった場合にスレッドにメッセージを送ることができます)。多くのスレッドから同時にログを記録し、エラーが発生した後でもログを処理します。ロガーが終了する前に終了するのを待つ try catch ループでメイン スレッドをラップします (セグメンテーション違反には役立ちませんが、ほとんどのエラーには役立ちます)。さらに、メッセージをロガーにパントし、IO 操作を待機することなくメイン プログラム スレッドに進むことができます (実行時間の大幅な短縮につながる可能性があります)。また、実装も難しくありません。キューの API は非常に限られているため、データ構造とのやり取りは、スコープ付きロックでリストをラップするだけです。
この実装には少額の代償がかかります。つまり、固定価格です。ただし、他のマルチスレッドを追加する必要がある場合は、ロガーを再構築する必要はなく、IO を別のスレッドにオフロードすることで、おそらくシングル スレッドのロガーよりも高速になります。
メッセージの順序が正しくない場合は、2 つのオプションがあります。キューのログ ワーカー側でログの並べ替えを行います (ワーカーが古いメッセージを保持するためのローカル バッファーを保持します)。または、タイムスタンプを使用してメッセージを並べ替え、挿入時に少し高い価格を支払うことを使用して、ログ キューの実装を優先キューに変更します。後者はおそらく実装が簡単ですが、より高い同期代価を支払います。
Boostスレッドを使用してC++でこの戦略を使用しましたが、非常にうまく機能します。クラッシュしても、クラッシュの直前からログを取得できます。作業をさまざまなスレッドに分岐して、簡単に並列化できる作業を行うときは、イベントの順序を簡単に追跡できるように、どこでも同じログ抽象化を使用するだけです。