Posix regcomp и regexec безопасны для потоков? В частности, на GNU libc? - PullRequest
11 голосов
/ 10 декабря 2010

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

Ответы [ 2 ]

8 голосов
/ 10 декабря 2010

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 () и обработчике сигналов, возможно, или в нескольких потоках облегченных процессов.

0 голосов
/ 10 декабря 2010

Можно ли использовать регулярные выражения в многопоточной программе без блокировки

Разные, да.

могу ли я использовать одно и то же regex_t одновременно в нескольких потоках?

В целом: если вы планируете сделать это, вам придется выполнить блокировку вокруг функций, поскольку лишь немногие структуры данных выполняют блокировку за вас.

regexec: Поскольку regexec, однако, принимает const regex_t, выполнение regexec кажется безопасным для одновременного выполнения без блокировки. (В конце концов, это POSIX.1-2001, где такие глупые вещи, как статические буферы, которые использовались в ранних API BSD, больше не встречаются.)

...