首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PCRE pcre_exec线程安全?

PCRE pcre_exec线程安全?
EN

Stack Overflow用户
提问于 2016-08-13 03:21:07
回答 1查看 608关注 0票数 2

我有一个C程序,它使用PCRE正则表达式来确定是否应该将cgroup中的进程添加到一个变量或另一个变量中。我在每个运行的cgroup中生成一个线程来读取cpuacct.stat文件,其中线程的数量从未超过核心的数量。然后将这些样本和结果组合成两个变量中的一个。

相关的代码片段是:

代码语言:javascript
复制
    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)。这些变量目前是全局的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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文档。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38928867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档