PCRE PCRE_exec线程安全?
我有一个C程序,它使用PCRE正则表达式来确定cgroup中的进程是否应该添加到一个变量或另一个变量中。我生成一个线程来读取每个正在运行的cgroup中的cpuacct.stat文件,其中线程的数量从未超过核心的数量。然后将这些样本和结果合并为两个变量之一 相关的代码片段是:PCRE PCRE_exec线程安全?,c,linux,multithreading,pcre,C,Linux,Multithreading,Pcre,我有一个C程序,它使用PCRE正则表达式来确定cgroup中的进程是否应该添加到一个变量或另一个变量中。我生成一个线程来读取每个正在运行的cgroup中的cpuacct.stat文件,其中线程的数量从未超过核心的数量。然后将这些样本和结果合并为两个变量之一 相关的代码片段是: pcreExecRet = pcre_exec(reCompiled, pcreExtra, queue,
pcreExecRet = pcre_exec(reCompiled,
pcreExtra,
queue,
strlen(queue), // length of string
0, // Start looking at this point
0, // OPTIONS
subStrVec,
30); // Length of subStrVec
//CRITICAL SECTION?
pthread_mutex_lock(&t_lock); //lock mutex
while (sumFlag == 0) {
pthread_cond_wait(&ok_add, &t_lock); //wait on ok signal
}
if(pcreExecRet > 0) {
sumOne += loadavg;
} else if (pcreExecRet == PCRE_ERROR_NOMATCH){
sumTwo += loadavg;
} else {
perror("Could not determine sum!\n"); //if this fails
}
sumFlag = 1;
pthread_cond_signal(&ok_add); //signal that it is ok to add
pthread_mutex_unlock(&t_lock); //unlock mutex
我的问题是pcre_exec()调用是否是线程安全的?是否应将其移至关键部分?我知道编译后的正则表达式是线程安全的,但我不确定pcreExtra(const pcre_extra)或subStrVec(int*ovector)。这些变量目前是全局变量。是的,它是线程安全的,所有PCRE函数都是线程安全的,但在某些情况下您应该小心 以下是来自
多线程
PCRE函数可用于多线程应用程序,具有
内存管理功能所指向的限制条件
pcre_malloc、pcre_free、pcre_stack_malloc和pcre_stack_free,以及
pcre_callout指向的callout和stack checking函数,以及
pcre_堆栈_保护,由所有线程共享。
正则表达式的编译形式在匹配过程中不会改变-
因此,相同的编译模式可以安全地由多个线程使用
马上。
如果正在使用实时优化功能,则需要sepa-
为每个线程的内存堆栈区域打分。请参阅pcrejit文档
更多细节。
pcre\u exec()
的文档说明了什么?此外,您还可以使用检查线程相关的问题。Ovector不能在线程之间共享,原因我认为是显而易见的。我会为每个线程分配一个。是的,我读过这篇文章,编译的正则表达式是线程安全的,但是我不确定pcre_extra或ovector参数是否可以共享。我也要试试赫尔格兰德。谢谢@anthozep pcre_extra是安全的(它实际上是正则表达式定义的一部分),但ovector绝对不安全,因为它包含实际的匹配结果。@Lucastzesniewski是的,所有全局变量在没有同步的情况下当然是不安全的。