Qt中的线程池QThreadPool

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作, 则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。- 选自百度百科


Qt中的 QThreadPool 类管理一组 QThreads

QThreadPool 管理和回收各个 QThread 对象, 以帮助减少使用线程的程序中的线程创建成本。每个Qt应用程序都有一个全局 QThreadPool 对象, 可以通过调用 globalInstance() 来访问它。也可以单独创建一个 QThreadPool 对象使用。

要使用线程池中的一个线程,只需要两步:

  1. 子类化 QRunnable 并实现 run() 函数。
  2. 调用函数 start() 启动线程。

下面是一个简单的使用示例:
创建一个 QRunnable 的子类,并实现 run 函数

#include <QRunnable>
class CRunnable : public QRunnable
{
public:
    void run(void) override;
};
void CRunnable::run(void)
{
    qDebug() << "Hello Thread Pool" << ", " \
             << QThread::currentThreadId();
}

调用部分:

CRunnable* runnable = new CRunnable;
QThreadPool::globalInstance()->start(runnable);

这样就实现从线程池中取一个线程去执行任务。


(1) QRunnable 对象的自动删除

默认情况下,QThreadPool 会自动删除 QRunnable 。 即上面的例子中,runnable 这个对象会在任务执行完毕后自动删除。 使用 QRunnable::setAutoDelete() 来更改自动删除标记, 默认为 true ,如果设置成 false ,则需要开发人员手动删除。

(2) 多个 QRunnable 对象的调用

如果想要执行多次同一个 QRunnable 对象,可以使用 tryStart() 函数; 如果 QRunnable 设置自动删除 autoDeletetrue , 则该对象在最后一次调用执行完成后被释放,此时不建议多次调用 start() 函数。

(3) 线程超时销毁机制

一段时间内未使用的线程将会被销毁。默认的过期超时时间是30000毫秒(30秒)。可以使用setExpiryTimeout() 修改它。设置负过期超时将禁用过期机制,直到线程池被销毁时,该线程才会退出。

(4) 设置和获取最大线程数以及获取当前激活线程数

调用 maxThreadCount() 来查询要使用的最大线程数。 如果需要,可以使用setMaxThreadCount() 更改限制。默认的 maxThreadCount()QThread::idealThreadCount() 。 也就是你的电脑的CPU核心数。 函数activeThreadCount() 函数的作用是,返回当前正在工作的线程数。

不会飞的纸飞机
扫一扫二维码,了解我的更多动态。

下一篇文章:使用QWaitCondition实现一个简单的线程池