std :: regex线程安全吗?

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对象,应该来以最小的性能开销,为每个线程使用/在其休闲修改.