c中的pthread
头文件: include <pthread.h>
pthread使用
pthread_t tid[num_of_thread];
for(int i = 0;i < num_of_thread;i++){
┊ pthread_create(&tid[i],NULL,callback,NULL);
}
for(int i=0;i<num_of_thread;i++){
┊ pthread_join(tid[i],NULL);//等待线程结束
}
pthread_create创建线程
pthread_create(&thrd1, NULL, (void *)&thread_function, (void *) &some_argument)
四个参数:线程变量名,线程的属性指针,线程回调函数,回调函数的参数
pthread_exit 结束线程
线程结束调用实例:pthread_exit(void *retval); //retval用于存放线程结束的退出状态
pthread_join 线程等待
pthread_join()函数,以阻塞的方式等待thread指定的线程结束。当函数返回时,被等待线程的资源被收回。如果线程已经结束,那么该函数会立即返回。
c++中的thread
c++ thread使用
将函数指针传给thread类,在线程中执行回调函数
std::thread test(&MainWindow::threadHandle);
test.detach();
detch()方法的意思就是开启子线程,并且主线程不等待子线程运行完毕,而是和子线程并行运行
join()方法的意思就是开启子线程,线程会按照开启的先后顺序同步运行
Qt中的多线程
线程操作
1.线程启动
void start(Priority priority = InheritPriority)
调用后会执行run()函数,但在run()函数执行前会发射信号started(),操作系统将根据优先级参数调度线程。如果线程已经在运行,那么这个函数什么也不做。
2.线程执行
int exec()
进入事件循环并等待直到调用exit(),返回值是通过调用exit()来获得,如果调用成功则范围0。
virtual void run();
线程的起点,在调用start()之后,新创建的线程就会调用这个函数,默认实现调用exec(),大多数需要重新实现这个功能,便于管理自己的线程。该方法返回时,该线程的执行将结束。
3.线程退出
void quit()
告诉线程事件循环退出,返回0表示成功,相当于调用了QThread::exit(0)。
void exit(int returnCode = 0)
告诉线程事件循环退出。
调用这个函数后,线程离开事件循环后返回,QEventLoop::exec()返回returnCode,
按照惯例0表示成功,任何非0值表示失败。
void terminate()
终止线程,线程可能会立即被终止也可能不会,这取决于操作系统的调度策略,使用terminate()之后再使用QThread::wait()确保万无一失。
当线程被终止后,所有等待中的线程将会被唤醒。
一般情况下,都在run函数里面设置一个标识符,可以控制循环停止。然后才调用quit函数,退出线程。
4.线程等待
void msleep(unsigned long msecs)
5.线程状态
bool isFinished() const
bool isRunning() const
6.线程优先级
void setPriority(Priority priority)
Priority priority() const
7. 示例
方法一: 继承QThread类(子类化QThread类)
- 新建子类化类
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = nullptr);
~MyThread();
void stop(void); //控制run()里边的while()
protected:
void run(void); //重新实现QThread::run()自定义自己的线程
signals:
public slots:
private:
bool m_runFlag; //run()停止暂停标志
int m_count; //计数,表示程序运行
};
- 在主线程中实现MyThread
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
m_myThread = new MyThread;
}
Widget::~Widget()
{
delete m_myThread;
delete ui;
}
void Widget::on_pb_start_clicked()
{
m_myThread->start();
}
void Widget::on_pb_stop_clicked()
{
m_myThread->stop();
}
方法二:QObject::moveToThread()方法
QThread *thread = new QThread();
this->moveToThread(thread);
this->threadHandle();
相当于把整个类放到QThread去执行