线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。原生的C++由于没有提供线程池模型,所以开发线程池功能比较繁琐。QT中的QThreadPool提供了现成的方案,使用起来就方便多了。这里对QThreadPool的使用提供了一个简单的实例。计算质素和比较耗时,这里就用计算10000000以内质素和的方式模式计算机耗时操作,对比单线程和线程池两种不同的方法的耗时。最后测试结果:采用多线程池,最后耗时4255ms;采用单线程,最后耗时15716ms。
代码如下:
#include <QtCore/QCoreApplication>
#include<iostream>
#include <QtCore/qglobal.h>
#include <QRunnable>
#include <QThread>
#include <QThreadPool>
#include <QDebug>
#include <QMutex>
#include <QElapsedTimer>
using namespace std;
//判断是否是质素
bool is_prime(int n) {
if (n <= 1) return false;
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) return false;
}
return true;
}
int gCount = 10000000;
long long gSum = 0;
QMutex gMutex;
void sumPrime()
{
bool bRet = false;
long long iSum = 0;
for (int i = 1; i < gCount; i++)
{
bRet = is_prime(i);
if (bRet)iSum += i;
}
qDebug() << iSum;
gMutex.lock();
gSum += iSum;
gMutex.unlock();
}
class Task : public QRunnable
{
void run() override
{
费时操作
sumPrime();
}
};
int main(int argc, char *argv[])
{
auto *task1 = new Task();
auto *task2 = new Task();
auto *task3 = new Task();
auto *task4 = new Task();
QThreadPool *pool = QThreadPool::globalInstance();
pool->setMaxThreadCount(4);
QElapsedTimer timer;
timer.start();
float t1 = timer.elapsed();
pool->start(task1);
pool->start(task2);
pool->start(task3);
pool->start(task4);
pool->waitForDone();
float t2 = timer.elapsed();
qDebug() << "thread pool calc over";
qDebug() << "elapsed time:" << t2 - t1;
qDebug() << "Sum:" << gSum;
gSum = 0;
t1 = timer.elapsed();
//主线程中循环计算4次,并把4次结果累加
for (int i = 0; i < 4; i++)
sumPrime();
t2 = timer.elapsed();
qDebug() << "main thread calc over";
qDebug() << "elapsed time:" << t2 - t1;
qDebug() << "Sum:" << gSum;
system("pause");
}
执行结果:
可以从以上执行结果中看出:采用多线程池,最后耗时4255ms;采用单线程,最后耗时15716ms。