Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PCRE PCRE_exec线程安全?_C_Linux_Multithreading_Pcre - Fatal编程技术网

PCRE PCRE_exec线程安全?

PCRE PCRE_exec线程安全?,c,linux,multithreading,pcre,C,Linux,Multithreading,Pcre,我有一个C程序,它使用PCRE正则表达式来确定cgroup中的进程是否应该添加到一个变量或另一个变量中。我生成一个线程来读取每个正在运行的cgroup中的cpuacct.stat文件,其中线程的数量从未超过核心的数量。然后将这些样本和结果合并为两个变量之一 相关的代码片段是: pcreExecRet = pcre_exec(reCompiled, pcreExtra, queue,

我有一个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()调用是否是线程安全的?是否应将其移至关键部分?我知道编译后的正则表达式是线程安全的,但我不确定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是的,所有全局变量在没有同步的情况下当然是不安全的。