Wir verwenden ein
%Vor%in einem Logger von uns, der eine UTF-16-Zeichenfolge von einer Legacy-Komponente erhält und sie in UTF-8 konvertiert, die wir in das Protokoll schreiben. Der Konverter wird bei jeder Konvertierung instanziiert, was wir tun
%Vor% Dies geschieht in einem ziemlich intensiven und multi-threaded Teil unseres Codes und ich möchte eine Instanz des Konverters wiederverwenden, aber wenn ich sehe, dass std::wstring_convert
einen "Zustand" freilegt, mache ich mir Sorgen to_bytes
ist nicht threadsicher und alle Gewinne, die wir durch die Wiederverwendung der gleichen Instanz erzielen könnten, würden durch die exzessive Sperrung verloren gehen, die dann benötigt würde (in diesem Fall würde ich die Instanz sowieso nicht teilen).
Also, ist std::wstring_convert<>::to_bytes
threadsicher?
BEARBEITEN: Eine Klarstellung dessen, was ich wirklich frage: Wenn eine Instanz von std::wstring_convert<>
aufgerufen wird, wenn 2 oder mehr Threads gleichzeitig to_bytes
für diese Instanz mit unterschiedlichen Argumenten aufrufen, ist to_bytes
garantiert dann gut?
Da std::wstring_convert
Teil der Standardbibliothek ist, folgt bestimmte Regeln , wenn es darum geht, ein Objekt dieses Typs aus verschiedenen Threads zu behandeln.
Da sowohl to_bytes
als auch from_bytes
overloads nicht const
sind, ist es insbesondere nicht möglich, diese Elemente für ein bestimmtes Objekt aus verschiedenen Threads ohne Synchronisierung zu verwenden. Dies ist sinnvoll, da Codecvt-Konvertierungen typischerweise ein state_type
-Objekt verwenden. Die Verwendung ohne Synchronisierung würde zu einem Desaster führen.
Tags und Links c++ multithreading stl