QRegularExpression匹配线程安全性
QRegularExpression matching thread safety
我可以在多个线程中安全地使用Qt QRegularExpression
而不锁定吗?regex对象将被声明为全局const
,我将只使用const
成员函数。
不能保证QRegularExpression
的单个显式共享实例是线程安全的。如果你调用的只是const
成员函数,那么它们可能还可以,但不能保证。唯一有文件证明的保证是,两个不同的实例可以在两个不同线程中使用,而无需锁定,即实例之间隐式共享的任何数据都是内部同步的。
然而,QRegularExpression
是Qt的隐式共享类之一,这意味着复制QRegularExpression
的实例非常便宜,因为副本将共享原始实例的数据,并且只有修改了其中一个实例(写时复制),才会复制实际数据。共享数据本身是线程安全的。
因此,真正安全(高效)的方法是在每个线程中制作全局QRegularExpression
的本地副本:
QRegularExpression globalRegex("[A-Za-z_][A-Za-z0-9_]*");
void thread1() {
auto localRegex = globalRegex;
// do something with localRegex
}
void thread2() {
auto localRegex = globalRegex;
// do something with localRegex
}
复制共享数据的唯一情况是修改其中一个本地regex对象,在这种情况下,单个全局regex对象无论如何都不会是线程安全的。如果您真的希望在线程之间共享一个全局QRegularExpression
对象,那么建议使用锁。
相关文章:
- 类与私有变量的其他类之间的线程安全性
- 调用socket.remote_endpoint(提升 asio 库)线程安全性
- std::lock_guard 似乎提供了线程安全性,尽管作用域块
- C++中向量和列表的非写入成员函数的线程安全性
- 线程安全性和静态变量/成员功能
- 是仅使用get或toplown的原始类型的线程安全性的威胁
- 提高 ASIO stream_descriptor和事件 FD 线程安全性
- 是boost :: asio :: thread_pool线程在多个线程上发布任务时的安全性
- OpenMP中树结构的线程安全性
- 静态变量初始化的线程安全性
- c++线程的安全性和时间效率:为什么有互斥检查的线程有时比没有它的线程工作得更快
- 从另一个(非 qt)线程调用 QObject 方法的线程安全性?
- C 共享_ptr如何确保线程安全性
- 编写std::vector与普通数组的线程安全性
- C++标准库容器相对于所包含对象的线程安全性
- 读取和写入操作的线程安全性C++
- Qt库-静态成员函数的线程安全性
- QObject可重入性和线程安全性
- std::map中的线程安全性
- boost::asio io_service 和 std::containers 的线程安全性