Zwei getrennte Fragen hier wirklich: Kann ich reguläre Ausdrücke in einem multithreaded Programm ohne Verriegelung, und wenn ja, kann ich das gleiche regex_t zur gleichen Zeit in mehreren Threads verwenden? Ich kann keine Antwort auf Google oder den Hilfeseiten finden.Sind posix regcomp und regexec threadsafe? Genauer gesagt, auf GNU libc?
Antwort
Kann ich reguläre Ausdrücke in einem multithreaded Programm ohne
unterschiedliche Verriegelungs, ja.
kann ich die gleiche regex_t gleichzeitig in mehreren Threads verwenden?
Allgemein: Wenn Sie dies vorhaben, müssen Sie die Funktionen sperren, da nur wenige Datenstrukturen die Sperre für Sie übernehmen.
regexec: Da jedoch regexec nimmt eine const
regex_t, regexec Ausführung scheint sicher für die gleichzeitige Ausführung ohne Verriegelung. (Immerhin ist dies POSIX.1-2001, wo dumme Sachen wie statische Puffer wie in der Regel in den frühen BSD-APIs verwendet werden, nicht mehr auftreten.)
http://www.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html
2.9.1 Thread-Sicherheit
Alle von diesem Volumen von POSIX.1-2008 definierten Funktionen sind außer Thread-sicher zu sein, dass die folgende Funktionen1 nicht Thread-sicher zu sein braucht.
...
regexec
und regcomp
sind nicht in dieser Liste, so sind sie verpflichtet, Thread-sicher zu sein. auch
Siehe: http://www.opengroup.org/onlinepubs/9699919799/functions/regcomp.html
Teil der Begründung Textes lautet:
Die Schnittstelle so definiert ist, dass das angepasste Teil rm_sp rm_ep und in einer separaten regmatch_t Struktur anstelle von in regex_t. Dies ermöglicht, dass ein einzelnes kompiliertes RE gleichzeitig in mehreren Kontexten verwendet wird; in main() und einem Signal-Handler vielleicht oder in mehreren Threads von leichtgewichtigen Prozessen.
Beachten Sie, dass POSIX ausdrücklich angibt, dass es sicher ist, denselben Regex in mehreren Threads zu verwenden, und der Grund, warum es so entworfen wurde, wird in der Begründung erwähnt. –
Von der Regexec-Manpage: "Das kompilierte Formular wird während der Ausführung von regexec() nicht geändert, sodass ein einzelner kompilierter RE gleichzeitig von mehreren Threads verwendet werden kann." – ctpenrose