【问题标题】:Are posix regcomp and regexec threadsafe? In specific, on GNU libc?posix regcomp 和 regexec 线程安全吗?具体来说,在 GNU libc 上?
【发布时间】:2011-05-23 05:15:35
【问题描述】:

这里真的有两个单独的问题:我可以在多线程程序中使用正则表达式而不加锁吗?如果可以,我可以在多个线程中同时使用相同的 regex_t 吗?我在 Google 或手册页上找不到答案。

【问题讨论】:

    标签: c regex pthreads posix libc


    【解决方案1】:

    http://www.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html

    2.9.1 线程安全

    本卷 POSIX.1-2008 定义的所有函数都应是线程安全的,但以下函数1不需要是线程安全的。

    ...

    regexecregcomp 不在该列表中,因此它们必须是线程安全的。

    另见:http://www.opengroup.org/onlinepubs/9699919799/functions/regcomp.html

    部分理由如下:

    接口被定义为匹配的子字符串 rm_sp 和 rm_ep 在一个单独的 regmatch_t 结构中,而不是在 regex_t 中。这允许在多个上下文中同时使用单个编译的 RE;在 main() 和信号处理程序中,或者在轻量级进程的多个线程中。

    【讨论】:

      【解决方案2】:

      我可以在多线程程序中使用正则表达式而不加锁吗

      不同的,是的。

      我可以在多个线程中同时使用相同的 regex_t 吗?

      一般来说:如果您打算这样做,则必须围绕函数进行锁定,因为很少有数据结构会为您进行锁定。

      regexec:由于 regexec 需要 const regex_t,因此执行 regexec 似乎对于并发执行而言是安全的,无需锁定。 (毕竟,这是 POSIX.1-2001,早期 BSD API 中使用的静态缓冲区等愚蠢的东西通常不会再出现了。)

      【讨论】:

      • 请注意,POSIX 明确规定在多个线程中使用相同的正则表达式是安全的,其设计原理中提到了这种方式的原因。
      • 来自 regexec 手册页:“编译的形式在 regexec() 执行期间不会改变,因此单个编译的 RE 可以被多个线程同时使用。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      相关资源
      最近更新 更多