虽然我知道 QT 声明只有特别声明的类是线程安全的,但我想了解为什么一个“const”标记的方法 - QPainterPath::contains() - 在没有任何并发的并行循环中调用它时会中断写操作:
#include <QPainterPath>
#include <omp.h>
#include <iostream>
int main(int argc, char *argv[])
{
QPainterPath path;
path.addRect(-50,-50,100,100);
#pragma omp parallel for
for(int x=0; x<100000; ++x)
if(!path.contains(QPoint(0,0)))
std::cout << "failed\n";
return 0;
}
上面的代码在不应该的时候随机输出“失败”。
我的理解是,尽管方法是“const”,但它正在以某种方式改变其内部状态: https ://code.woboq.org/qt5/qtbase/src/gui/painting/qpainterpath.cpp.html#_ZNK12QPainterPath8containsERK7QPointF
我需要比较点是否在多个线程的路径内(以加快处理速度),但它不适用于 QPainterPath。即使我为每个线程创建了对象的副本,QT 也会在写入时复制,除非我更改派生对象(强制它分离),否则结果仍然是相同的错误行为,因为它仍然使用相同的共享数据。如果没有这个丑陋的黑客,我怎样才能以安全的方式做到这一点?