C++/QT/OpenMP:访问同一实例时,线程似乎在等待
C++/QT/OpenMP : Threads seems to wait when access to the same instance
我在一个算法上使用C++
、Qt
和OpenMP
,该算法对图(弧和节点)进行一些处理。类Node
使用静态类来管理具有节点上的指针的邻接列表的图(类Graph
)。我可以询问节点的继任者或前任,并且我会收到节点上指针的QList
。
目标是在图中找到一些受约束的路径。
我使用OpenMP
对算法进行并行化。好的一点是每个线程都有自己的任务列表,不需要通过互斥共享或保护资源。但是每个线程读取图形的相同实例或读取节点上的一些信息。图形和节点是共享的,但仅用于读取。
当我使用n
线程时,计算时间是顺序时间的n
倍。为什么?如果线程在同一个实例上使用相同的方法,它们是否在等待?我使用的所有Qt
结构都是可重入的。我的应该也是,除了我使用静态成员这一事实。但没有任何改变。
有什么想法吗?
好的,我发现了问题。我使用QDateTime,并且经常使用toTime_t()将日期转换为整数。这很耗时。我以为整数是一个成员。我想它每次都会计算日期。
但我不明白我的时差。如果我使用1个线程,那么并行部分需要400ms。如果我把问题分成4个线程,并行需要1600ms!!但如果我一个接一个地执行这4个线程,每个线程需要100ms,总共400ms。函数是使用系统调用还是使用线程安全的静态转换?
不管怎样,现在它工作得很好!我在类中存储了一次toTime_t()的结果。
相关文章:
- 工作线程在执行太快后永久休眠
- 使用 std::atomic 标志和 std::condition_variable 在工作线程上等待
- C++ 11 线程在分离后会自动销毁吗?
- 分离的线程:在繁忙时销毁互斥锁 错误C++
- openmp 锁由同一线程重新获取,而另一个线程正在等待它
- 对于同一任务,线程的等待时间在 0 到 30000 微秒之间系统地切换
- librdkafka 线程在失败时不清理
- 是局部unordered_map变量线程在C 中安全的线程
- CPP如何使主线程等到其他线程在周期中完成
- C 不同的线程在FreeBSD 10上具有相同的线程ID
- 线程在销毁包含该线程的对象时调用 thread.detach()
- 防止线程在处理异常后在分离时调用 std::terminate()
- 如何让一个线程继续,而另一个线程正在等待C++中的信号量
- std::线程在 Windows 窗体中不可用
- 当其中一个线程在 C++ 中使用 pthread 被杀死时,我如何保持进程的存活
- 线程在 read() 上阻塞时"消失",如何调试它?
- C++线程在完成执行后仍然"可连接()"?
- QMutex ,如果线程在起作用,请在此处等待
- 如何让线程在 std::list 上等待值
- Qt5中存在哪些同步原语,允许我在单个线程中等待信号到达