gpt4 book ai didi

c++ - QtConcurrent 与多线程的 QThread 的多线程性能

转载 作者:IT老高 更新时间:2023-10-28 21:42:04 31 4
gpt4 key购买 nike

假设您的应用程序需要在多个线程中运行一个函数,这些线程的数量大于 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源代码。

第一层:run

QFuture<T> run(T (*functionPointer)())  
{
return (new StoredFunctorCall0<T, T (*)()>(functionPointer))->start();
}

Second :

struct StoredFunctorCall0: public RunFunctionTask<T>    { ...

Third :

template <typename T>
class RunFunctionTaskBase : public QFutureInterface<T> , public QRunnable
{ ...

现在关于 QRunnable .当我们开始 QRunnableQThreadPool我们这样做:

start()调用 tryStart()调用 startThread()使用 QThreadPoolThread 操作(它是 QThread subclass )最后调用 start()QThread .

当然,这条链条并不完整,很长的路,不是吗?所以据我所知,当我们使用抽象时,我们有抽象惩罚( QtConcurrentQThread 有更大的惩罚),但最终结果是相同的,它是 QThread .

关于c++ - QtConcurrent 与多线程的 QThread 的多线程性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30680358/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com