Bru*_*nez 9 c++ regex std thread-safety
与静态boost :: wregex实例相关的是线程安全的吗?但对于标准版本.我可以从具有相同正则表达式对象的多个线程调用regex_search吗?
Sea*_*ine 15
声称std::regex
在各方面都是线程安全的,这是一个非常大胆的声明.C++ 11标准不对正则表达式库提供此类保证.
然而,看着std::regex_search
节目的原型,它将basic_regex
对象作为const参数.这意味着它受标准库的保护,即const修饰符暗示函数相对于该参数的线程安全性.
在标准中,即:
[17.6.5.9/1] 本节规定了实现为防止数据竞争而应满足的要求(1.10).除非另有说明,否则每个标准库函数均应满足各项要求 在下面指定的情况下,实现可能会阻止数据争用.
[17.6.5.9/3] A C++标准库函数应不直接或间接地修改对象(1.10)比当前线程,除非对象通过该函数的直接或间接访问的其它线程访问非const参数,包括
this
.
所以,在你使用标准库的实现禁止的错误,看来调用std::regex_search
是线程安全的对于regex
传递进来的对象.
其他想法:
仅仅因为std::regex_search
它的regex
论证是重新进入并不意味着你完全脱离了水.执行以regex
线程安全调用的同时以非线程安全方式修改a的操作,例如std::regex_search
仍然是未定义的行为.basic_regex
的赋值运算符,std :: swap,并且basic_regex::imbue
考虑到basic_regex
它们运行时的非线程安全函数.知道了这一点,它可能是更好的为您做出的拷贝regex
对象,应该来以最小的性能开销,为每个线程使用/在其休闲修改.