【qt】锁

线程安全问题.

多线程程序太复杂了.

加锁

把多个线程要访问的公共资源,通过锁保护起来.=>把并发执行变成串行执行.

Linux mutex 互斥量.

C++11引入std::mutex

Qt 同样也提供了对应的锁,来针对系统提供的锁进行封装.QMutex

多个线程进行加锁的对象,得是同一个对象,不同对象,此时不会产生锁的互斥,也就无法把并发执行->串行执行,也就无法解决上述问题.

之前如果是并发执行,就可能第一个线程修改了一半,第二个线程也进行修改.就容易出现问题.(Linux 中详细介绍,++操作对应三个 cpu指令)

加了锁之后,第一个线程顺利拿到锁,继续执行++,在第一个线程没执行完的事后,第二个线程也尝试加锁,就会阻塞等待.一直等到第一个线程释放锁,第二个线程才能从阻塞中被唤醒.


没加锁两个线程对同一个变量++

thread.h

c 复制代码
#ifndef THREAD_H
#define THREAD_H
#include<QThread>
#include<QMutex>
class Thread : public QThread
{
public:
    Thread();
    void run();
    static int num;
    static QMutex mutex;
};

#endif // THREAD_H

widget.h

c 复制代码
#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include"thread.h"
#include<QDebug>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

thread.cpp

c 复制代码
#include "thread.h"
int Thread::num=0;
//QMutex  Thread::mutex;
Thread::Thread()
{





}
void Thread::run()
{

    for(int i=0;i<500000;i++)
    {  // mutex.lock();
        num++;
       // mutex.unlock();

    }




}

widget.cpp

c 复制代码
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    Thread t1;
    Thread t2;
    t1.start();
    t2.start();

    t1.wait();
    t2.wait();


  qDebug()<<Thread::num;






}

Widget::~Widget()
{
    delete ui;
}

但是使用上面的锁的话,如果在加锁和解锁直接直接return ,或者抛异常的话,就会导致死锁问题

释放动态内存,也存在类似的问题,C++ 引入 智能指针就是解决上述问题的.

C++ 11 引入了std::lock guard,相当于是std::mutex智能指针,借助 RAII 机制.

std::lock_guard guard(mutex);

Qt 的锁和 C++ 标准库中的锁,本质上都是封装的系统提供的锁,编写多线程程序的时候,可以使用 Qt 的锁,也可以使用C++ 的锁.C++ 的锁能不能锁 Qt 的线程?也是可以的~~(虽然混着用也行,一般不建议)

qt实现:

相关推荐
郑州光合科技余经理4 分钟前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程
思茂信息1 小时前
CST软件BCI仿真模型及仿真案例
开发语言·单片机·嵌入式硬件·算法·emc
阿里嘎多学长1 小时前
2026-09-28 GitHub 热点项目精选
开发语言·程序员·github·代码托管
程序猿编码2 小时前
C++/CUDA 手写 LLM 推理引擎:拆解 vLLM 核心 PagedAttention 与连续批处理
开发语言·c++·深度学习·神经网络·推理·vllm
hold?fish:palm2 小时前
44 二叉搜索树中第K小的元素
开发语言·c++·算法
凉茶钱2 小时前
【吃透C++】万字解析类和对象
开发语言·c++
白杨尚青3 小时前
C++入门篇(十):string(上)——认识string:构造与三大遍历(一条龙讲透operator[]、迭代器、auto、范围for)
java·开发语言·c++·笔记·stl
可乐鸡翅yeah_3 小时前
hls.js 切换多个视频源,新手开发常见踩坑
开发语言·前端·javascript·ios·ffmpeg·音视频·safari
Tanshu_API君3 小时前
API 聚合平台选型指南:从参数拆解到生产落地的十个评估维度
开发语言·api
Chen—LSN3 小时前
C语言——⽂件操作(1)
c语言·开发语言·c++·经验分享·笔记·算法·链表