举例:统计字符串中字母‘w’的个数
使用单线程:
int main(int argc, char *argv[])
{
QString text;
text = "mainwindow";
text = text.repeated(50000000);//将字符串重复50000000次
int count = 0;
QElapsedTimer timer;
timer.start();
for (int i = 0; i < text.size(); i++) {
if (text[i] == 'w') {
count++;
}
}
qDebug() << "time:" << timer.elapsed();
qDebug() << "count:" << count;
}
结果:
使用多线程:
#include <QThreadPool>
#include <QDebug>
#include <QElapsedTimer>
#include <QMutex>
class Counter : public QRunnable
{
public:
Counter(const QString &string, QMutex *mutex, int *count)
{
mString = string;
mMutex = mutex;
mCount = count;
}
private:
void run()
{
int count = 0;
for (int i = 0; i < mString.length(); i++) {
if (mString[i] == 'w') {
count++;
}
}
//多线程操作共享变量需要加锁
mMutex->lock();
*mCount += count;
mMutex->unlock();
}
QString mString;
QMutex *mMutex;
int *mCount;
};
int main(int argc, char *argv[])
{
QString text;
text = "mainwindow";
text = text.repeated(50000000);//将字符串重复50000000次
int count = 0;
QElapsedTimer timer;
timer.start();
auto pool = QThreadPool::globalInstance();
pool->setMaxThreadCount(6);//设置最多6个线程
QMutex mutex;//定义锁
//将字符串分割为50个子串,分别统计
for (int i = 0, split = text.length() / 50; i < 50; i++) {
QString childText = text.mid(split * i, text.length() / 50);
Counter *a = new Counter(childText, &mutex, &count);
a->setAutoDelete(true); //执行完后自动释放
pool->start(a);
}
pool->waitForDone();
qDebug() << "time:" << timer.elapsed();
qDebug() << "count:" << count;
}
结果: