C++/QT/OpenMP:访问同一实例时,线程似乎在等待

C++/QT/OpenMP : Threads seems to wait when access to the same instance

本文关键字:线程 在等待 实例 OpenMP QT 访问 C++      更新时间:2023-10-16

我在一个算法上使用C++QtOpenMP,该算法对图(弧和节点)进行一些处理。类Node使用静态类来管理具有节点上的指针的邻接列表的图(类Graph)。我可以询问节点的继任者或前任,并且我会收到节点上指针的QList

目标是在图中找到一些受约束的路径。

我使用OpenMP对算法进行并行化。好的一点是每个线程都有自己的任务列表,不需要通过互斥共享或保护资源。但是每个线程读取图形的相同实例或读取节点上的一些信息。图形和节点是共享的,但仅用于读取。

当我使用n线程时,计算时间是顺序时间的n倍。为什么?如果线程在同一个实例上使用相同的方法,它们是否在等待?我使用的所有Qt结构都是可重入的。我的应该也是,除了我使用静态成员这一事实。但没有任何改变。

有什么想法吗?

好的,我发现了问题。我使用QDateTime,并且经常使用toTime_t()将日期转换为整数。这很耗时。我以为整数是一个成员。我想它每次都会计算日期。

但我不明白我的时差。如果我使用1个线程,那么并行部分需要400ms。如果我把问题分成4个线程,并行需要1600ms!!但如果我一个接一个地执行这4个线程,每个线程需要100ms,总共400ms。函数是使用系统调用还是使用线程安全的静态转换?

不管怎样,现在它工作得很好!我在类中存储了一次toTime_t()的结果。