表示尝试去加锁,timeout 为超时时间。如果互斥锁为可用状态,该函数会占用该互斥锁,并返回 true ,否则返回 false 。如果互斥锁被另一个线程占用,该函数会等待 timeout 毫秒直到互斥锁为可用状态。
- 在复杂函数和语句或异常处理代码中lock和unlock QMutex很容易出错,而且很难调试。在这种情况下,可以使用QMutexLocker替代。
预期:两个线程使用一把锁,操作一个数据,数据会被两个线程依次打印1.2.3.4…
MyThread.h
#ifndef MYTHREAD_H
#define MYTHREAD_H
#include
#include
class MyThread : public QThread
{
Q_OBJECT
public:
explicit MyThread(QObject *parent = nullptr);
void run();
private:
static QMutex mutex; // 多个线程使用一把锁
static int num; // 多个线程访问一个数据
};
#endif // MYTHREAD_H
MyThread.cpp
#include "mythread.h"
#include
QMutex MyThread::mutex;
int MyThread::num = 0;
MyThread::MyThread(QObject *parent) : QThread(parent)
{
}
void MyThread::run()
{
while (1) {
this->mutex.lock();// 加锁
qDebug() << "Current Thread: " << this
<< ", Value: " << this->num++;
this->mutex.unlock();// 解锁
QThread::sleep(1);// 线程睡眠两秒
}
}
mainWindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainWindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "mythread.h"
#include
#include
#include
#include
#include
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
MyThread *myThread1 = new MyThread(this);
MyThread *myThread2 = new MyThread(this);
myThread1->start();
myThread2->start();
}
MainWindow::~MainWindow()
{
delete ui;
}
预期:两个线程使用一把锁,操作一个数据,数据会被两个线程依次打印1.2.3.4…
MyThread.cpp
#include "mythread.h"
#include
#include
QMutex MyThread::mutex;
int MyThread::num = 0;
MyThread::MyThread(QObject *parent) : QThread(parent)
{
}
void MyThread::run()
{
while (1) {
// QMutexLocker:创建的时候加锁,当QMutexLocker局部销毁的时候解锁
{
QMutexLocker lock(&this->mutex);
qDebug() << "Current Thread: " << this
<< ", Value: " << this->num++;
}
QThread::sleep(1);// 线程睡眠两秒
}
}