std::regex线程安全吗?
Is std::regex thread safe?
静态boost::wregex实例线程安全吗?但是对于标准化版本。我可以调用regex_search从几个线程与相同的regex对象?
声称std::regex
在各个方面都是线程安全的,这是一个相当大胆的声明。c++ 11标准没有对regex库做这样的保证。
然而,查看std::regex_search
的原型显示,它将basic_regex
对象作为const参数。这意味着它受到标准库保证的保护,即const修饰符暗示函数相对于该实参具有线程安全性。
在标准中,即:
[17.6.5.9/1] 本节指定实现应满足的要求,以防止数据争用(1.10)。除非另有规定,每个标准库函数都应满足每项要求。除下面指定的情况外,实现可以防止数据争用。
[17.6.5.9/3] c++标准库函数不能直接或间接地修改当前线程以外的线程可以访问的对象(1.10),除非这些对象是通过函数的非const参数直接或间接访问的,包括
this
。
因此,除非在您使用的标准库的实现中出现错误,看起来对std::regex_search
的调用相对于传入的regex
对象是线程安全的。
其他想法:
仅仅因为std::regex_search
相对于它的regex
参数是可重入的并不意味着你完全脱离了水。以非线程安全的方式执行修改regex
的操作,同时执行线程安全的调用,如std::regex_search
,仍然是未定义的行为。basic_regex
的赋值操作符std::swap和basic_regex::imbue
对于它们所操作的basic_regex
来说是非线程安全的函数。知道了这一点,最好是创建regex
对象的副本,这应该以最小的性能成本为每个线程在空闲时使用/修改。
虽然Sean的回答对于标准来说是正确的,但个别实现可能会有不足。至少vc++ 2013在它的复制构造函数和惰性求值变量中有竞争条件。
- 从不同线程使用int64的不同字节安全吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- 线程调用的函数对对象删除是否安全?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具