这里有两个独立的问题:我可以在没有锁定的多线程程序中使用正则表达式,如果是这样,我可以在多个线程中同时使用相同的regex_t吗?我无法在Google或联机帮助页上找到答案。
答案 0 :(得分: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()和信号处理程序中,或者在轻量级进程的多个线程中。
答案 1 :(得分:0)
我可以在没有锁定的情况下在多线程程序中使用正则表达式
不同的,是的。
我可以在多个线程中同时使用相同的regex_t吗?
一般情况下:如果您计划这样做,则必须围绕这些函数进行锁定,因为很少有数据结构为您执行锁定。
regexec:因为regexec需要const
regex_t,所以执行regexec 似乎对于并发执行而言没有锁定是安全的。 (毕竟,这是POSIX.1-2001,早期的BSD API中使用的静态缓冲区等愚蠢的东西通常不会再出现了。)