QtConcurrent与多线程QThread的多线程性能
Multithreading performance of QtConcurrent Vs QThread with many threads
假设您的应用程序需要在多个线程中运行一个函数,这些线程的数量大于CPU内核/线程的数量。一种方法是使用QtConcurrent
并设置最大线程数:
MyClass *obj = new MyClass;
QThreadPool::globalInstance()->setMaxThreadCount(30);
for(int i=0;i<30;i++)
QtConcurrent::run(obj, &MyClass::someFunction);
另一种方法是使用moveToThread
将多个对象移动到不同的线程:
for(int i=0;i<30;i++)
{
MyClass *obj = new MyClass;
QThread *th = new QThread();
obj->moveToThread(th);
connect(th, SIGNAL(started()), obj, SLOT(someFunction()) );
connect(obj, SIGNAL(workFinished()), th, SLOT(quit()) );
connect(th, SIGNAL(finished()), obj, SLOT(deleteLater()) );
connect(th, SIGNAL(finished()), th, SLOT(deleteLater()) );
th->start();
}
由于线程数大于CPU核数,运行时需要在不同核间切换线程。
问题是这两种方法是否有不同的性能?也就是说,QThread
的开关与QtConcurrent::run
的开关不同吗?
我同意第一个答案,但我想补充一点。
QThread
是低级别的类,只运行操作系统特定的功能。QtConcurrent
是什么?答案在Qt
源代码中。
第一级:运行
QFuture<T> run(T (*functionPointer)())
{
return (new StoredFunctorCall0<T, T (*)()>(functionPointer))->start();
}
第二:struct StoredFunctorCall0: public RunFunctionTask<T> { ...
第三:template <typename T>
class RunFunctionTaskBase : public QFutureInterface<T> , public QRunnable
{ ...
现在谈谈QRunnable
。当我们用QThreadPool
启动QRunnable
时,我们这样做:
start()调用tryStart()
, startThread()
与QThreadPoolThread
一起操作(它是一个QThread子类),最后调用QThread
的start()
。
当然这条链不是完整的,路很长,不是吗?因此,据我所知,当我们使用抽象时,我们有抽象惩罚(QtConcurrent
比QThread
有更大的惩罚),但最终结果是一样的,它是QThread
。
简短的回答:这取决于工作负载的性质/逻辑。
QtConcurrent运行一个线程池,它是一个更高级别的API ,不适合运行大量的阻塞操作:如果你做了很多阻塞操作,你很快就会耗尽池并使其他请求排队。在这种情况下,QThread(较低级别的构造)可能更适合于操作(每个都代表一个线程)。
相关文章:
- 在main()之外初始化std::vector会导致性能下降(多线程)
- Linux VM(重型多线程应用程序)的性能改进
- 使用较新版本的 g++ 导致多线程性能下降?
- 在多线程环境中使用 libcurl 会导致与 DNS 查找相关的性能非常慢
- C++多线程性能比单线程代码慢
- 提升 asio io_service多线程性能不佳
- 多线程功能性能比单线螺纹差
- 为什么c++中的多线程会降低性能
- 内存分配对多线程性能的影响
- C 11多线程在神经网络中的性能非常缓慢
- 2个数组/图像相乘的多线程性能-英特尔IPP
- 与单线程相比,c++/java的多线程性能结果参差不齐
- 可以通过减少多线程中系统调用(互斥/信号量)的开销来真正提高性能::atomic
- 为什么具有多线程的for循环的性能不如单线程
- C++独立数据的多线程性能
- PC多线程性能和稳定性问题的简单基准测试.如何使每个线程在单独的核心上运行
- 多线程性能问题
- 多线程性能
- 多线程性能在执行几次操作后下降
- QtConcurrent与多线程QThread的多线程性能