Ich muss stdout in meiner Logging-Anwendung zu sperren, um String-Interleaving in Multi-Thread-Anwendungen zu verhindern, die auf stdout protokollieren. Kann nicht herausfinden, wie man move constructor oder std :: move oder etw sonst benutzt um unique_lock in ein anderes Objekt zu verschieben.C++ Sperren Stream-Operatoren mit Mutex
Ich erstellte Objekte zum Festlegen von Konfigurationen und Verkapselungen und fand heraus, wie man stdout mit statischem std :: mutex sperren kann, um von diesen Objekten (sogenannten Shards) zu sperren.
So etwas wie das funktioniert für mich:
l->log(1, "Test message 1");
Während die fein und könnte mit Vorlagen und variable Anzahl von Parametern realisiert wird ich mehr Strom artige Möglichkeiten nähern möchte. Ich bin auf der Suche nach so etwas wie folgt aus:
*l << "Module id: " << 42 << "value: " << 42 << std::endl;
Ich möchte nicht um Benutzer zwingen Zeichenfolge vorauszuberechnen mit Verkettung und to_string (42) Ich will nur einen Weg finden, stdout zu sperren.
Meine bisherige Vorgehensweise war, Operator < < und einen anderen Objekt gesperrten Stream zu erstellen, wie in anderen Antworten vorgeschlagen wurde. Dinge sind, ich kann nicht herausfinden, wie man Mutex zu einem anderen Objekt bewegt. Mein Code:
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;
}
Nach dem Ausgeben der Eingabe an Std :: Cout möchte ich Sperre in Objektstrom verschieben.
Nicht sicher, ob der Kommentar geschätzt wird, aber was ich in dieser Situation tun würde, ist Logging auf einen anderen Thread zu entladen. Der Protokollierungsthread wird ohne Sperren in stdout geschrieben, während die anderen Threads die Nachrichten über eine blockierungsfreie Warteschlange senden können. Viel weniger Konflikte und mehr Durchsatz und keine Notwendigkeit für Websperren durch Stream-Operationen. Ich werde trotzdem eine Antwort hinzufügen. –
Ich weiß es zu schätzen! Ich werde versuchen, Ihre Antwort und den vorhandenen Code zusammenzuführen, behalte aber Ihren Vorschlag im Hinterkopf! Könnte auch versuchen, es später so umzuschreiben. – MarcusSK