0

サーバーに接続し、他の機能に加えて、サーバーチャットをファイルに記録するクライアントアプリケーションを作成しているので、ルール違反は後で罰せられる可能性があります。
残念ながら、アプリケーションには(少なくとも)2つのスレッド(受信者ループと送信者ループ)が必要になりました。サーバーにはタイミング歳差運動が必要です。つまり、データをファイルに記録するためのスレッドセーフなソリューションが必要です。
これは、スレッドが(可能な限り)同時にログ情報を送信する場合に発生する可能性があります。

logfile.txt:
chat: Hello my name is Duke
chat: Hell[WARNING]: Hacker detectedo my name is John

ある文が別の文に注入されているのを見ることができます。私はこれが決して起こらないようにしたい。同じことが私のstd::cout出力にも起こりますが、それはそれほど重要ではありません。

質問:

  1. std::ofstream一度に1つのデータのみをログに記録するにはどうすればよいですか?(他のことを覚えて、途中ではなく、後で挿入します)
  2. ファイルが他のスレッドによって閉じられたかどうかを確認するにはどうすればよいですか。(またはエラー)

ボーナス質問:同じ問題を解決できますstd::coutか?

4

1 に答える 1

4

標準ストリームにはスレッドセーフの保証はありません。あなたがやろうとしていることを安全に達成する唯一の方法は、ストリームへのアクセスをシリアル化することです。

最も簡単な解決策は、ストリームを含むステートメントをミューテックスでラップすることです。

{
    std::lock_guard<std::mutex> locked(gCoutMutex);
    std::cout << "This is a message" << std::endl;
}

特にロガーの場合、より正確なアプローチは、メッセージキューを備えたロギングスレッドを用意することです。別のスレッドがログに記録する場合、メッセージをキューに送信するだけで、ログスレッドはキューを通過してすべてをディスクに書き込みます。

于 2013-03-26T22:12:31.013 に答える