gpt4 book ai didi

c++ - QRegularExpression匹配线程安全

转载 作者:行者123 更新时间:2023-11-30 02:44:06 49 4
gpt4 key购买 nike

我可以在多线程中安全地使用 Qt QRegularExpression 而无需锁定吗? regex 对象将声明为全局 const,我将仅使用 const 成员函数。

最佳答案

QRegularExpression 的单个显式共享实例不保证是线程安全的。如果你调用它的只是 const 成员函数,你可能没问题,但不能保证。唯一记录在案的保证是两个不同的实例可以在两个不同的线程中使用而无需锁定,即在实例之间隐式共享的任何数据都是内部同步的。

但是,QRegularExpression 是 Qt 的 implicitly shared classes 之一,这意味着复制 QRegularExpression 的实例非常便宜,因为拷贝将共享原始数据,只有实例被修改(写时复制)。和 shared data itself is thread-safe .

所以真正安全(和高效)的方法是在每个线程中制作全局 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 对象,那么建议使用锁。

关于c++ - QRegularExpression匹配线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25581696/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com