假设您的应用程序需要在多个线程中运行一个函数,该函数的数量大于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
。当我们开始QRunnable
时QThreadPool
:
开始() ,其调用tryStart()
该电话startThread()
与操作QThreadPoolThread
(它是一个QThread的子类),它是最后调用start()
的QThread
。
当然,这条链条还不够长,不是吗?据我所知,当我们使用抽象时,我们会有抽象罚分(QtConcurrent
然后有更大的罚分QThread
),但是最终结果是相同的QThread
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句