相关静态 boost::wregex 实例是线程安全的吗?但对于标准化版本。我可以从具有相同正则表达式对象的多个线程调用 regex_search 吗?
声称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
以非线程安全的方式同时进行线程安全调用,例如std::regex_search
仍然是未定义的行为。basic_regex
's 赋值运算符, 标准::交换, and basic_regex::imbue想到的是非线程安全函数basic_regex
他们运作。了解这一点后,您最好复印一份regex
对象,它应该以最小的性能成本为每个线程在闲暇时使用/修改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)