繁体   English   中英

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
}

复制共享数据的唯一情况是,如果要修改本地正则表达式对象之一,则单个全局正则表达式对象无论如何都不是线程安全的。 如果您确实希望在线程之间共享单个全局QRegularExpression对象,则建议使用锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM