std :: regex线程安全吗?

时间:2013-04-01 22:17:43

标签: c++ regex thread-safety std

Is a static boost::wregex instance thread-safe?相关,但与标准化版本相关。我可以从具有相同正则表达式对象的多个线程调用regex_search吗?

2 个答案:

答案 0 :(得分:15)

声称std::regex在各个方面都是线程安全的,这是一个非常大胆的声明。 C ++ 11标准不对正则表达式库做出这样的保证。

然而,查看std::regex_search的原型表明它将basic_regex对象作为const参数。这意味着它受标准库的保护,即保证函数的const修饰符implies thread-safety与该参数有关。

在标准中,即:

  

<强> [17.6.5.9/1]   本节规定了实现为防止数据争用而应满足的要求(1.10)。除非另有说明,否则每个标准库函数均应满足各项要求在下面指定的情况下,实现可能会阻止数据争用。

     

<强> [17.6.5.9/3]   除非通过函数的非const 参数直接或间接访问对象,包括{{1 }}

因此,除非您使用的标准库的实现存在错误,否则this的调用对于传入的std::regex_search对象来说是线程安全的。


其他想法:

仅仅因为regex在其std::regex_search论证方面是重入的,并不意味着你完全没有水。在线程安全调用(例如regex)的同时执行以非线程安全方式修改regex的操作仍然是未定义的行为。 std::regex_search的{​​{3}},assignment operatorstd::swap作为与其操作的basic_regex相关的非线程安全函数而浮现在脑海中。知道了这一点,你可能会更好地制作basic_regex对象的副本,这个对象应该以最低的性能成本,让每个线程在闲暇时使用/修改。

答案 1 :(得分:3)

虽然Sean's answer符合标准,但个别实施可能不尽如人意。至少VC ++ 2013看起来在它的拷贝构造函数和懒惰的评估变量中都有race conditions