QtConcurrent与多线程的QThread的多线程性能

内贾特

假设您的应用程序需要在多个线程中运行一个函数,该函数的数量大于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当我们开始QRunnableQThreadPool

开始() 其调用tryStart()该电话startThread()与操作QThreadPoolThread(它是一个QThread的子类),它是最后调用start()QThread

当然,这条链条还不够长,不是吗?据我所知,当我们使用抽象时,我们会有抽象罚分(QtConcurrent然后有更大的罚分QThread),但是最终结果是相同的QThread

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章