11

静态 boost::wregex 实例线程安全吗?但对于标准化版本。我可以从具有相同正则表达式对象的多个线程调用 regex_search 吗?

4

2 回答 2

17

声称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对象的副本,这应该以最低的性能成本为每个线程在闲暇时使用/修改。

于 2013-04-01T22:46:43.157 回答
4

虽然Sean 的回答对标准是正确的,但个别实施可能会达不到要求。至少,VC++ 2013 看起来在其复制构造函数和惰性求值变量中具有竞争条件。

于 2015-05-01T18:44:09.637 回答