QRegularExpression匹配线程安全性

QRegularExpression matching thread safety

本文关键字:安全性 线程 QRegularExpression      更新时间:2023-10-16

我可以在多个线程中安全地使用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对象,那么建议使用锁。