11

这里真的有两个单独的问题:我可以在没有锁定的多线程程序中使用正则表达式吗?如果可以,我可以在多个线程中同时使用相同的 regex_t 吗?我在 Google 或联机帮助页上找不到答案。

4

2 回答 2

8

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() 和信号处理程序中,或者在轻量级进程的多个线程中。

于 2010-12-10T01:03:25.577 回答
0

我可以在多线程程序中使用正则表达式而不加锁吗

不同的,是的。

我可以在多个线程中同时使用相同的 regex_t 吗?

一般来说:如果您打算这样做,则必须围绕函数进行锁定,因为很少有数据结构会为您进行锁定。

regexec:由于 regexec 需要一个constregex_t,因此执行 regexec对于并发执行来说似乎是安全的,无需锁定。(毕竟,这是 POSIX.1-2001,早期 BSD API 中使用的静态缓冲区等愚蠢的东西通常不再出现。)

于 2010-12-10T01:02:50.407 回答