std::regex线程安全吗?

Is std::regex thread safe?

本文关键字:安全 线程 regex std      更新时间:2023-10-16

静态boost::wregex实例线程安全吗?但是对于标准化版本。我可以调用regex_search从几个线程与相同的regex对象?

声称std::regex在各个方面都是线程安全的,这是一个相当大胆的声明。c++ 11标准没有对regex库做这样的保证。

然而,查看std::regex_search的原型显示,它将basic_regex对象作为const参数。这意味着它受到标准库保证的保护,即const修饰符暗示函数相对于该实参具有线程安全性。

在标准中,即:

[17.6.5.9/1] 本节指定实现应满足的要求,以防止数据争用(1.10)。除非另有规定,每个标准库函数都应满足每项要求。除下面指定的情况外,实现可以防止数据争用。

[17.6.5.9/3] c++标准库函数不能直接或间接地修改当前线程以外的线程可以访问的对象(1.10),除非这些对象是通过函数的非const参数直接或间接访问的,包括this

因此,除非在您使用的标准库的实现中出现错误,看起来对std::regex_search的调用相对于传入的regex对象是线程安全的。


其他想法:

仅仅因为std::regex_search相对于它的regex参数是可重入的并不意味着你完全脱离了水。以非线程安全的方式执行修改regex的操作,同时执行线程安全的调用,如std::regex_search,仍然是未定义的行为。basic_regex的赋值操作符std::swap和basic_regex::imbue对于它们所操作的basic_regex来说是非线程安全的函数。知道了这一点,最好是创建regex对象的副本,这应该以最小的性能成本为每个线程在空闲时使用/修改。

虽然Sean的回答对于标准来说是正确的,但个别实现可能会有不足。至少vc++ 2013在它的复制构造函数和惰性求值变量中有竞争条件。