首页| 论坛| 消息

回复: 程序运行一段时间后就出问题。
#6 回 liudianwu 的帖子 [介农酥 08-04 10:05]
liudianwu:加了锁不解锁,作死! (2019-08-03 21:49) 
加锁和解锁是在两个不同的函数中的,这样做不行吗?
#7 回 liulin188 的帖子 [介农酥 08-04 10:06]
liulin188:仔细检查下代码,我以前也遇到过这种问题。 (2019-08-03 16:05) 
加锁和解锁就前后两行代码,我想不出会哪里有误
#8 回 介农酥 的帖子 [firebolt 08-04 11:03]
介农酥:加锁和解锁是在两个不同的函数中的,这样做不行吗? (2019-08-04 10:05) 
也不是不行,但是你得保证能解除锁才行。如果你必须要这么用的话,请使用递归锁。
#9 [mmlgq 08-04 13:39]
加锁解锁用在两个函数没啥问题,在两个线程就问题,就是容易出现重复加解锁问题,一般尽量在一个函数完成,减少失误的几率。看了代码应该保证插入的一组 各种id一致就行,你这么多线程 信号和槽函数绑定的方式,我记得多线程的信号槽默认 是槽函数由自己的线程执行,你想保证一开始的carrierId,expressId id和后来的boxid一致 ,你信号槽 用参数一路带着就行了,不要加锁。你加锁本质上会导致加锁线程一致阻塞 直到你存数据的线程解锁。多线程效率没体现出来。个人见解,代码没仔细看。
#10 回 mmlgq 的帖子 [介农酥 08-04 20:15]
mmlgq:加锁解锁用在两个函数没啥问题,在两个线程就问题,就是容易出现重复加解锁问题,一般尽量在一个函数完成,减少失误的几率。看了代码应该保证插入的一组 各种id一致就行,你这么多线程 信号和槽函数绑定的方式,我记得多线程的信号槽默认 是槽函数由自己的线程执行,你想保证一开 .. (2019-08-04 13:39)
谢谢!你这个一路带着所有参数是个好办法。你说的信号和槽的运行方式,我之前半生半懂的,现在看来是个问题,特意在百度搜了下:如下

-------------------------------------------------------------------------------------------------------------------------------
第五个参数代表槽函数在哪个线程中执行 :
1)自动连接(AutoConnection),默认的连接方式,如果信号与槽,也就是发送者与接受者在同一线程,等同于直接连接;如果发送者与接受者处在不同线程,等同于队列连接。
2)直接连接(DirectConnection),当信号发射时,槽函数立即直接调用。无论槽函数所属对象在哪个线程,槽函数总在发送者所在线程执行,即槽函数和信号发送者在同一线程
3)队列连接(QueuedConnection),当控制权回到接受者所在线程的事件循环时,槽函数被调用。槽函数在接受者所在线程执行,即槽函数与信号接受者在同一线程
4)锁定队列连接(QueuedConnection)
Qt::BlockingQueuedConnection:槽函数的调用时机与Qt::QueuedConnection一致,不过发送完信号后发送者所在线程会阻塞,直到槽函数运行完。接收者和发送者绝对不能在一个线程,否则程序会死锁。在多线程间需要同步的场合可能需要这个。
5)单一连接(QueuedConnection)
Qt::UniqueConnection:这个flag可以通过按位或(|)与以上四个结合在一起使用。当这个flag设置时,当某个信号和槽已经连接时,再进行重复的连接就会失败。也就是避免了重复连接
---------------------
作者:52_赫兹的鲸
来源:CSDN
原文:https://blog.csdn.net/qq_40194498/article/details/79682811
版权声明:本文为博主原创文章,转载请附上博文链接!
--------------------------------------------------------------------------------------------------------- ..

<< 1 2 3 4 >> (2/4)

回复 发表
主题 版块