Bezogen auf Is a static boost::wregex instance thread-safe?, aber für die standardisierte Version. Kann ich regex_search aus mehreren Threads mit demselben Regex-Objekt aufrufen?Ist std :: regex thread sicher?
Antwort
Die Behauptung, dass std::regex
in jeder Hinsicht Thread-Safe ist, ist eine ziemlich kühne Aussage. Der C++ 11-Standard gibt solche Garantien für die Regex-Bibliothek nicht.
Allerdings zeigt der Blick auf den Prototyp std::regex_search
, dass es das basic_regex
Objekt als ein const Argument benötigt. Dies bedeutet, dass es durch die Garantie der Standardbibliothek geschützt ist, dass der const-Modifikator implies thread-safety der Funktion in Bezug auf dieses Argument ist.
In standardese, das heißt:
[17.6.5.9/1] Dieser Abschnitt legt Anforderungen erfüllen, dass Implementierungen werden die Daten gespeichert Rennen (1,10) zu verhindern. Jede Standardbibliotheksfunktion muss jede Anforderung erfüllen, sofern nicht anders angegeben. Implementierungen können Datenrennen in anderen als den unten angegebenen Fällen verhindern.
[17.6.5.9/3] Standardbibliotheksfunktion ++ A C wird nicht direkt oder indirekt Objekte ändern (1,10) zugänglich durch Fäden anderer als der aktuelle Thread, es sei denn die Gegenstände nicht direkt oder indirekt über die Funktion des zugegriffen -const Argumente, einschließlich
this
.
Also, einen Fehler in der Implementierung der Standardbibliothek Sperre, die Sie verwenden, scheint es, dass Anrufe an std::regex_search
Thread-sicher sind in Bezug auf das regex
Objekt, das in übergeben wird.
Andere Gedanken:
Nur weil std::regex_search
ist einspringenden in Bezug auf sein regex
Argument bedeutet nicht, dass Sie vollständig aus dem Wasser. Das Ausführen einer Operation, die eine regex
auf nicht threadsichere Weise gleichzeitig mit einem threadsicheren Aufruf wie std::regex_search
ändert, ist immer noch undefiniert. basic_regex
's assignment operator, std::swap und basic_regex::imbue
kommen als nicht-Thread-sichere Funktionen in Bezug auf die basic_regex
sie arbeiten auf. Wenn Sie dies wissen, ist es möglicherweise besser, eine Kopie des Objekts regex
zu erstellen, das zu minimalen Kosten für die Leistung führen sollte.
Während Sean's answer für den Standard gilt, kann die individuelle Implementierung zu kurz greifen. Zumindest sieht VC++ 2013 so aus, als hätte es race conditions in seinem Kopierkonstruktor und in einer faul bewerteten Variablen.
Nach diesem Ticket sollte es in der kürzlich veröffentlichten VS2015 behoben werden. –
- 1. ist std :: queue thread sicher mit hersteller und mehreren verbrauchern
- 2. Ist createTempFile Thread-sicher?
- 3. ist DatagramSocket.send thread sicher?
- 4. Ist DWScript Thread-sicher?
- 5. Ist File.ReadAllText Thread sicher?
- 6. Ist HtmlCleaner Thread sicher?
- 7. Ist DocumentBuilder.parse() Thread sicher?
- 8. Ist SDL_Delay() Thread sicher?
- 9. ist javax.sql.DataSource thread sicher?
- 10. Ist SoapHttpClientProtocol Thread sicher?
- 11. Ist beanManager.getReference() Thread-sicher?
- 12. Ist TStringList Thread sicher?
- 13. Ist Closesocket Thread sicher?
- 14. Ist libuv thread sicher?
- 15. Ist ConstructorInfo.GetParameters Thread-sicher?
- 16. Ist String.intern() Thread sicher
- 17. Ist SessionFactory.getCurrentSession() Thread sicher?
- 18. Ist SKNode Thread sicher?
- 19. Ist RequestContextHolder Thread-sicher?
- 20. Ist putStrLn Thread-sicher?
- 21. Ist Joiner Thread sicher?
- 22. Ist Stream.Write Thread-sicher?
- 23. Ist SQLite.Net Thread-sicher?
- 24. Ist Collectors.joining (",") Thread-sicher?
- 25. Thread sicher unique_ptr move
- 26. Ist Netty Channel.write Thread sicher?
- 27. Ist Perls inet_aton Thread-sicher?
- 28. Ist diese Klasse Thread sicher?
- 29. Ist Java TimeZone Thread-sicher?
- 30. Ist java.util.Vector Serialisierung Thread-sicher?
'std :: regex'-Instanzen stellen einen kompilierten regulären Ausdruck dar und sind * gemeint *, um wiederverwendet zu werden, da die Regex-Kompilierung ein kostspieliger Prozess ist. Natürlich wäre es blöd, eine existierende Instanz (sei es 'std :: regex' oder irgendetwas anderes) zu tauschen/neu zuzuordnen, während andere Threads sie bereits benutzen. – rustyx