Qt多线程中的锁

文章探讨了C++中的多线程同步,通过示例展示了不使用锁时线程行为,以及在使用QMutex或QMutexLocker时线程执行的顺序变化。重点在于理解锁在控制线程访问共享资源时的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例1:

如果不用锁,会发生什么呢?

参考:C++11多线程锁(入门)_c++线程加锁-优快云博客

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    qDebug()<<"main:"<<QThread::currentThreadId();
    connect(this,SIGNAL(destroyed()),this,SLOT(quitThreadSlot()));
    t=new try_thread(this);
    t->start();

    t1=new try_thread(this);
    t1->start();
}

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

void Widget::quitThreadSlot()
{
    t->quit();
    t->wait();

    t1->quit();
    t1->wait();
}

为什么要quit() :回头看[2024/8/28]这段代码,发现不需要执行quit()函数

因为如果线程没有开启事件循环的话,该函数不起作用。 

int counter=0;
try_thread::try_thread(QObject *parent) : QThread(parent)
{

}
void try_thread::run()
{
    for(int i=0;i<100;i++)
    {
        counter++;
        this->msleep(10);    //每10ms休眠1次
        qDebug()<<"son:"<<QThread::currentThreadId()<<"   "<<counter;
    }
}

输出结果:

main: 0x3948
son: 0x3ebc     2
son: 0x2140     2
son: 0x2140     4
son: 0x3ebc     4
son: 0x2140     6
son: 0x3ebc     6
son: 0x3ebc     8
son: 0x2140     8
son: 0x3ebc     10
son: 0x2140     10
son: 0x2140     12
son: 0x3ebc     12
son: 0x2140     14
son: 0x3ebc     14
son: 0x3ebc     16
son: 0x2140     16
son: 0x3ebc     18
son: 0x2140     18
s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伸头看云朵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值