与静态 boost::wregex 实例线程安全吗?但对于标准化版本。我可以从具有相同正则表达式对象的多个线程调用 regex_search 吗?
2 回答
声称std::regex
在各个方面都是线程安全的,这是一个非常大胆的声明。C++11 标准不对正则表达式库做出此类保证。
但是,查看 的原型std::regex_search
表明它将basic_regex
对象作为 const 参数。这意味着它受到标准库保证的保护,即 const 修饰符暗示函数相对于该参数的线程安全。
用标准话来说,就是:
[17.6.5.9/1] 本节规定了实现应满足的要求,以防止数据竞争 (1.10)。除非另有说明,否则每个标准库函数都应满足每个要求。实施可能会在下面指定的情况以外的情况下防止数据竞争。
[17.6.5.9/3] C++ 标准库函数不得直接或间接修改可由当前线程以外的线程访问的对象 (1.10),除非通过函数的非常量参数直接或间接访问对象,包括
this
.
因此,除非您使用的标准库的实现中出现错误,否则对传入的对象的调用似乎std::regex_search
是线程安全的。regex
其他想法:
仅仅因为std::regex_search
它的论点是可重入的,regex
并不意味着你完全不在水中。regex
在线程安全调用的同时执行以非线程安全方式修改 a 的操作,例如std::regex_search
仍然是未定义的行为。basic_regex
的赋值运算符,std::swap,并且相对于它们操作basic_regex::imbue
的非线程安全函数浮现在脑海中。basic_regex
知道了这一点,您最好制作一个regex
对象的副本,这应该以最低的性能成本为每个线程在闲暇时使用/修改。