Здесь есть два отдельных вопроса: могу ли я использовать регулярные выражения в многопоточной программе без блокировки, и если да, могу ли я использовать один и тот же regex_t одновременно в нескольких потоках? Я не могу найти ответ на Google или manpages.
Являются ли posix regcomp и regexec threadsafe? В частности, на GNU libc?
Ответ 1
http://www.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html
2.9.1 Безопасность потоков
Все функции, определенные этим томом POSIX.1-2008, должны быть потокобезопасными, за исключением того, что следующие функции1 не должны быть потокобезопасными.
...
regexec
и regcomp
не входят в этот список, поэтому они должны быть потокобезопасными.
Смотрите также: http://www.opengroup.org/onlinepubs/9699919799/functions/regcomp.html
Часть текста обоснования гласит:
Интерфейс определяется так, что согласованные подстроки rm_sp и rm_ep находятся в отдельной структуре regmatch_t, а не в regex_t. Это позволяет одновременно использовать один скомпилированный RE в нескольких контекстах; в main() и обработчике сигналов, возможно, или в нескольких потоках облегченных процессов.
Ответ 2
Можно ли использовать регулярные выражения в многопоточной программе без блокировки
Разные, да.
Можно ли использовать один и тот же regex_t одновременно в нескольких потоках?
В общем: если вы планируете это делать, вам придется выполнять блокировку функций, поскольку для вас требуется блокировка нескольких структур данных.
regexec: Так как regexec берет const
regex_t, выполнение regexec кажется безопасным для одновременного выполнения без блокировки. (В конце концов, это POSIX.1-2001, где глупые вещи, такие как статические буферы, используемые в ранних BSD API, обычно больше не встречаются.)