与Is a static boost::wregex instance thread-safe?相关,但与标准化版本相关。我可以从具有相同正则表达式对象的多个线程调用regex_search吗?
答案 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 operator和std::swap作为与其操作的basic_regex
相关的非线程安全函数而浮现在脑海中。知道了这一点,你可能会更好地制作basic_regex
对象的副本,这个对象应该以最低的性能成本,让每个线程在闲暇时使用/修改。
答案 1 :(得分:3)
虽然Sean's answer符合标准,但个别实施可能不尽如人意。至少VC ++ 2013看起来在它的拷贝构造函数和懒惰的评估变量中都有race conditions。