[英]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.