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

Другие вопросы по тегам