マルチスレッドアプリケーションでstdoutにログを記録するのを防ぐため、ロギングアプリケーションでstdoutをロックする必要があります。移動コンストラクタやstd :: moveやsth elseを使ってunique_lockを別のオブジェクトに移動する方法を理解できません。C++ミューテックスを使用したストリーム演算子のロック
configsとカプセル化を設定するためのオブジェクトを作成し、static std :: mutexでstdoutをロックしてこれらのオブジェクト(シャードと呼ばれる)からロックする方法を見つけました。このような
何かが私の作品:
l->log(1, "Test message 1");
それは結構ですとテンプレートと私はより多くのストリームのような可能性にアプローチしたいパラメータの可変数で実現することができますが。私はこのような何かを探しています:
*l << "Module id: " << 42 << "value: " << 42 << std::endl;
私は連結とto_stringに(42)で文字列を事前計算することをユーザーに強制したいいけない、私はちょうどSTDOUTをロックする方法を見つけたいです。
これまでのアプローチでは、オペレータ< <と他のオブジェクトロックストリームを作成する方法がありました。私はミューテックスを別のオブジェクトに移動する方法を理解できません。私のコード:
locked_stream& shard::operator<<(int num)
{
static std::mutex _out_mutex;
std::unique_lock<std::mutex> lock(_out_mutex);
//std::lock_guard<std::mutex> lock (_out_mutex);
std::cout << std::to_string(num) << "(s)";
locked_stream s;
return s;
}
入力をstd :: coutに出力した後、ロックをオブジェクトストリームに移動する必要があります。
コメントをいただければ幸いですが、この状況では他のスレッドへのログをオフロードすることになります。ロギングスレッドはロックなしでstdoutに書き込みますが、他のスレッドはロックフリーキューでメッセージを送信できます。競合が少なく、スループットが向上し、ストリーム操作によるロックを製織する必要がありません。私は無関係に答えを加えます。 –
私はそれを感謝します! 私はあなたの答えと既存のコードをマージしようとしますが、あなたの念頭に置いておきます!後でそれを書き直すこともできます。 – MarcusSK