posix regcomp和regexec在GNU libc上是线程安全的吗?

11

这里实际上有两个不同的问题:我能在多线程程序中使用正则表达式而不需要锁定吗?如果可以的话,我能同时在多个线程中使用同一个regex_t吗?我在Google或manpages上找不到答案。

2个回答

8

http://www.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html

2.9.1 线程安全性

本卷中定义的所有函数均应该是线程安全的,但以下函数1除外,它们不需要是线程安全的。

...

regexecregcomp 不在上述列表中,因此它们需要是线程安全的。

另请参阅:http://www.opengroup.org/onlinepubs/9699919799/functions/regcomp.html

部分原理文本如下:

接口被定义为匹配子字符串 rm_sp 和 rm_ep 在一个单独的 regmatch_t 结构中而不是 regex_t 中。这使得单个编译后的正则表达式可以同时在多个上下文中使用;例如在主函数和信号处理程序中,或者在多个轻量级进程的线程中。


-1
我能在多线程程序中使用正则表达式而不锁定吗?
可以使用不同的,但是要注意:如果你打算这样做,就必须在函数周围进行锁定,因为很少有数据结构会为您完成锁定。
对于相同的regex_t,我可以在多个线程中同时使用吗?
一般来说,如果您打算这样做,就必须在函数周围进行锁定,因为很少有数据结构会为您完成锁定。然而,由于regexec采用一个const regex_t,执行regexec似乎可以安全地并发执行而不需要锁定。(毕竟,这是POSIX.1-2001,在早期BSD API中使用的静态缓冲区等愚蠢的东西通常不会再出现。)

请注意,POSIX 明确声明在多个线程中使用相同的正则表达式是安全的,并且设计该方式的原因已在理论基础中提到。 - R.. GitHub STOP HELPING ICE
从regexec手册页面中: "编译后的形式在regexec()执行期间不会被更改,因此单个编译的RE可以同时被多个线程使用。" - ctpenrose

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接