posix regcomp和regexec线程安全吗?具体来说,关于GNU libc?

posix regcomp和regexec线程安全吗?具体来说,关于GNU libc?,c,regex,pthreads,posix,libc,C,Regex,Pthreads,Posix,Libc,这里有两个独立的问题:我可以在多线程程序中使用正则表达式而不锁定吗?如果可以,我可以在多个线程中同时使用相同的正则表达式吗?我在谷歌或个人主页上找不到答案 我可以在多线程程序中使用正则表达式而不锁定吗 不同的,是的 我可以在多个线程中同时使用相同的正则表达式吗 一般来说:如果您计划这样做,您将不得不围绕函数执行锁定,因为很少有数据结构为您执行锁定 regexec:由于regexec需要一个常量regex\t,因此执行regexec对于并发执行来说似乎是安全的,无需锁定。毕竟,这是POSIX.1-

这里有两个独立的问题:我可以在多线程程序中使用正则表达式而不锁定吗?如果可以,我可以在多个线程中同时使用相同的正则表达式吗?我在谷歌或个人主页上找不到答案

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

不同的,是的

我可以在多个线程中同时使用相同的正则表达式吗

一般来说:如果您计划这样做,您将不得不围绕函数执行锁定,因为很少有数据结构为您执行锁定

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

2.9.1螺纹安全

POSIX.1-2008本卷定义的所有功能都应是线程安全的,但以下功能1不需要是线程安全的

regexec和regcomp不在该列表中,因此它们必须是线程安全的

另见:

部分理由案文如下:

接口的定义使得匹配的子字符串rm_sp和rm_ep位于单独的regmatch_t结构中,而不是位于regex_t中。这允许在多个上下文中同时使用单个编译的RE;在主线程和信号处理程序中,或者在轻量级进程的多个线程中


请注意,POSIX明确指出,在多个线程中使用同一个正则表达式是安全的,其设计原因在原理中也有提及。从regexec手册页可以看出:在执行regexec期间,编译的形式不会改变,因此多个线程可以同时使用单个编译的RE。