我有一个C程序,它使用PCRE正则表达式来确定是否应该将cgroup中的进程添加到一个变量或另一个变量中。我在每个运行的cgroup中生成一个线程来读取cpuacct.stat文件,其中线程的数量从未超过核心的数量。然后将这些样本和结果组合成两个变量中的一个。
相关的代码片段是:
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()调用是否线程安全?应该把它移到关键部分吗?我知道编译的regex是线程安全的,但我不确定pcreExtra (const pcre_extra)或subStrVec (int *ovector)。这些变量目前是全局的。
发布于 2016-08-13 04:12:27
是的,它是线程安全的,所有的PCRE函数都是,但是在某些情况下您应该小心。
以下是来自manual pages for 的
多线程PCRE函数可以在多线程应用程序中使用,但条件是pcre_malloc、pcre_free、pcre_stack_malloc和pcre_stack_free所指向的内存管理功能以及pcre_callout和pcre_stack_guard所指向的标注和堆栈检查功能由所有线程共享。正则表达式的编译形式在匹配期间不会改变,因此同一编译模式可以安全地同时被多个线程使用。如果使用的是实时优化功能,它需要每个线程的sepa速率内存堆栈区域。有关详细信息,请参阅pcrejit文档。
https://stackoverflow.com/questions/38928867
复制相似问题