本文已参与「新人创作礼」活动,一起开启掘金创作之路
对于线程的解释:
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。
线程是独立调度和分派的基本单位。线程可以为操作系统内核调度的内核线程,如Win32线程;由用户进程自行调度的用户线程,如Linux平台的POSIX Thread;或者由内核与用户进程,如Windows 7的线程,进行混合调度。
同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。 一个进程可以有很多线程,每条线程并行执行不同的任务。
在多核或多CPU,或支持Hyper-threading的CPU上使用多线程程序设计的好处是显而易见,即提高了程序的执行吞吐率。在单CPU单核的计算机上,使用多线程技术,也可以把进程中负责I/O处理、人机交互而常被阻塞的部分与密集计算的部分分开来执行,编写专门的workhorse线程执行密集计算,从而提高了程序的执行效率。
对于QT,下面介绍两种办法实现多线程编程
方法一:使用QThread类 继承QThread类,覆写run函数,使用run方法启动线程,使用wait方法等待线程退出 例子: mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include<QDebug>
class myThread : public QThread
{
Q_OBJECT
public:
explicit myThread(int threadId,QObject *parent = 0);
void run();
int threadId;
signals:
public slots:
};
#endif // MYTHREAD_H
mythread.cpp
#include "mythread.h"
myThread::myThread(int threadId,QObject *parent) :
threadId(threadId),
QThread(parent)
{
}
void myThread::run(){
for(int i=0;i<5;i++){
QThread::msleep(100);
qDebug()<<"Thread "<<threadId<<" is running,i="<<i;
}
}
main.cpp
#include <QCoreApplication>
#include <mythread.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
myThread mt(1);
myThread mt1(2);
mt.start();
mt1.start();
mt.wait();
mt1.wait();
return a.exec();
}
运行结果:
方法二:使用QRunnable 继承QRunnable类,覆写run方法,使用QThreadPool的start方法启动线程,使用waitForDone方法等待线程退出 例子: mythread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QRunnable>
#include<QThread>
#include<QDebug>
class myThread : public QRunnable
{
//Q_OBJECT 不是QObject的子类,不需要定义Q_OBJECT
public:
explicit myThread(int threadId,QObject *parent = 0);
void run();
int threadId;
signals:
public slots:
};
#endif // MYTHREAD_H
mythread.cpp
#include "mythread.h"
myThread::myThread(int threadId,QObject *parent) :
threadId(threadId)
{
}
void myThread::run(){
for(int i=0;i<5;i++){
QThread::msleep(100);
qDebug()<<"Thread "<<threadId<<" is running,i="<<i;
}
}
main.cpp
#include <QCoreApplication>
#include<mythread.h>
#include<QThreadPool>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
myThread *mt=new myThread(1);
myThread *mt1=new myThread(2);
QThreadPool tp;
tp.start(mt);
tp.start(mt1);
tp.waitForDone();
return a.exec();
}
运行结果: