Являются ли posix regcomp и regexec threadsafe? В частности, на GNU libc?

Здесь есть два отдельных вопроса: могу ли я использовать регулярные выражения в многопоточной программе без блокировки, и если да, могу ли я использовать один и тот же regex_t одновременно в нескольких потоках? Я не могу найти ответ на Google или manpages.

Ответ 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, обычно больше не встречаются.)