PCRE pcre_exec 线程安全吗?

2024-02-13

我有一个 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 http://www.pcre.org/pcre.txt

MULTITHREADING

   The PCRE functions can be used in  multi-threading  applications,  with
   the  proviso  that  the  memory  management  functions  pointed  to  by
   pcre_malloc, pcre_free, pcre_stack_malloc, and pcre_stack_free, and the
   callout  and  stack-checking  functions  pointed to by pcre_callout and
   pcre_stack_guard, are shared by all threads.

   The compiled form of a regular expression is not altered during  match-
   ing, so the same compiled pattern can safely be used by several threads
   at once.

   If the just-in-time optimization feature is being used, it needs  sepa-
   rate  memory stack areas for each thread. See the pcrejit documentation
   for more details.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCRE pcre_exec 线程安全吗? 的相关文章

随机推荐

  • 设置 md-grid-list 样式

    我正在使用 Angular Material 网格列表来显示大约 500 1000 个项目 我在根据自己的喜好设计它时遇到了一些麻烦 这是网格列表现在的样子
  • Cassandra中删除表或截断表哪个更好

    我们有一个用例 我们需要每天使用 Cassandra 中的当前数据重新创建一个表 为此 我们应该使用 drop table 还是 truncate table 哪个会更有效率 我们不希望数据被备份等 谢谢 安库尔 我认为对于几乎所有情况 截
  • Windows 8 Phone 客户端证书 HTTPS 身份验证

    我正在尝试使用我正在开发的 Windows 8 Phone 应用程序中的客户端证书访问安全的 HTTPS 服务器 这根本不起作用 这让我尝试从标准 Web 浏览器访问 HTTPS 服务器 但它也不起作用 我不知道 Internet Expl
  • 从 SonarQube 删除项目

    有谁知道如何从 SonarQube 服务器删除项目 谢谢 罗南 您有 2 种方法可以删除项目 如果您是项目的管理员 则可以从其配置操作中将其删除 gt 参见 项目管理 文档页面中的 删除项目 https docs sonarqube org
  • 如何从 SQL Server 中的 TOP 中排除 LEFT JOINed 表?

    假设我有两个书籍表和两个对应版本的表 我有一个查询如下 SELECT TOP 10 FROM SELECT hbID hbTitle hbPublisherID hbPublishDate hbedID hbedDate FROM hard
  • Typescript 和 React 组件接受 TextArea 和 Input 的 onChange

    我是打字稿新手 我正在尝试创建一个输入组件 如果它收到type text 它呈现一个input如果它收到type textarea 它呈现 你明白了 一个textarea 问题是 当我在代码中使用该组件时 打字稿会抱怨onChange 似乎
  • 与我的自定义 Streambuf 类一起使用时,istream::tellg() 返回 -1?

    我正在尝试创建一个istream直接从原始内存缓冲区读取 我在这里的另一篇文章中找到了一个很好的方法 class membuf public basic streambuf
  • 在 C 中编码多管道

    我正在尝试在 C 中为我的 shell 实现多管道 我所拥有的只是一个管道函数 用于管道 b 但不是 a 乙 C int c 2 int returnv pid t id pipe c pid fork 0 if pid dup2 c 1
  • 从 werkzeug 导入安全导入 werkzeug VS

    我目前的理解 基于这些答案 one https stackoverflow com questions 9439480 from import vs import two https stackoverflow com questions
  • 我需要在 PHP 中转义反斜杠吗?

    我需要在 PHP 中转义反斜杠吗 echo Application Models User Prints Application Models User echo Application Models User Same output ec
  • 如何在nhibernate中进行子查询?

    我需要对子集合执行子查询 但无法让它工作 我试过这个 Task tAlias null List
  • 我们如何在 Grails 中迁移/更新数据库架构?

    我们使用 Grails 已经有一段时间了 我的团队负责人提出了一些关于 Grails ORM GORM 的问题 一旦我们进入生产环境 我们如何维护数据库模式 我们可以使用 Grails 更新数据库架构吗 如果更新架构 更改是否会自动反映 框
  • 如何判断我的 IE 是否是 64 位? (就此而言,Java 也是如此吗?)

    网络上已经有数以百万计的问题涉及如何判断操作系统是否是 64 位 但不知道 IE 和 或 Java 运行时是否是 64 位 一些背景 我安装了 64 位 Win 7 IE 会自动从 CD 中安装 我没有下载IE 我确实下载了Java运行时
  • 我们如何在 Comparator.comparing 中传递变量字段/方法名称

    我有一个Report String name Date date int score 班级 我希望能够使用新的 java 8 语法对任何成员变量的报告列表进行排序 所以java 8提供了这个新的 list sort Comparator c
  • Android studio 虚拟设备未加载

    我有 4GB 内存 android studio 虚拟设备显示 ANDROID 所以加载是无限的 它没有结束 我已经等太久了 可能是什么问题 无论我使用什么应用程序 您尝试过使用 Genymotion 吗 它比普通虚拟设备好数百倍 这里有一
  • Ruby - 将目录添加到 $LOAD_PATH - 它有什么作用?

    这实际上是关于这个问题的一个问题 将目录添加到 LOAD PATH Ruby https stackoverflow com questions 837123 adding a directory to load path ruby 将目录
  • 使用 gulp 创建 tar 档案

    我正在使用 gulp tar 创建一个 tar 文件 如何添加顶级文件夹 以便当用户运行时tar xzf myArchive tar它解压到特定的文件夹中 这是我的代码 gulp task prod min gittag function
  • div 向下滑动时自动聚焦在输入字段上

    我有一个隐藏的div 单击按钮时 div 会向下滑动并带有输入字段 如何让这个输入框在 div 向下滑动时自动对焦 谢谢
  • sphinx autodoc包含子功能

    我想在 sphinx 文档中自动包含函数的子函数 有什么选择呢 我的代码看起来像 import numpy def mainfunc to be documented def subfunc to be documented as well
  • PCRE pcre_exec 线程安全吗?

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