2010-12-10 10 views

Antwort

0

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.)

+0

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. –

+0

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

8

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.