【发布时间】:2015-08-21 05:17:14
【问题描述】:
假设您的应用程序需要在多个线程中运行一个函数,其数量超过 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 运行的切换不同吗?
【问题讨论】:
-
这取决于每个线程做什么。经验法则:对于 CPU 绑定的线程,线程数多于内核数会降低整体性能;对于 I/O 绑定线程,线程可能比可用内核多。你需要测量。
-
@RichardCritten 你说得对,但这里的问题是
QtConcurrent和QThread在切换时间上的区别。 -
取决于您的用例。与往常一样,测量一下它是否会对您的情况产生影响。 QConcurrent 是围绕 QThreads 的便利,区别在于任务的调度和资源利用方式,而不是上下文切换时间。编写自己的解决方案会给您带来更大的灵活性,但当然也会带来更多的工作量和更多的错误。
-
@FrankOsterfeld 但是这里所有的资源利用率、调度、.. 都是相同的,因为 30 个线程运行相同的功能。只有启动线程的方法不同。所以我认为唯一的区别是两者之间的上下文切换有何不同。
标签: c++ multithreading qt qthread qtconcurrent