Являются ли posix regcomp и regexec потокобезопасными? В частности, на GNU libc?
На самом деле два отдельных вопроса: могу ли я использовать регулярные выражения в многопоточной программе без блокировки и, если да, могу ли я использовать один и тот же regex_t одновременно в нескольких потоках? Я не могу найти ответ в Google или на страницах руководства.
2 ответа
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() и обработчике сигналов, возможно, или в нескольких потоках облегченных процессов.
Могу ли я использовать регулярные выражения в многопоточной программе без блокировки
Разные, да.
я могу использовать одно и то же regex_t одновременно в нескольких потоках?
В целом: если вы планируете сделать это, вам придется выполнить блокировку вокруг функций, поскольку лишь немногие структуры данных выполняют блокировку за вас.
regexec: поскольку regexec принимает const
regex_t, выполнение regexec кажется безопасным для одновременного выполнения без блокировки. (В конце концов, это POSIX.1-2001, где такие глупые вещи, как статические буферы, которые использовались в ранних API BSD, обычно больше не встречаются.)