问题标签 [qmutex]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
517 浏览

c++ - "Attempting to reference a deleted function" after adding QMutex to class

I am building an application with Qt5. My program builds and runs fine, but there is a collision between two threads accessing a data structure. I have a QList of CanMessage objects, and I want to protect some data inside of it using a QMutex. However, as soon as I add the QMutex to my class definition, I get errors:

Here is my canmessage.h file:

And cansignal.h:

0 投票
1 回答
1308 浏览

python - threading.Lock() 是否与 QThread() 兼容,QMutex() 是否与 python 线程兼容?

我在Windows 10计算机上使用Python 3.7(带有用于 GUI的PyQt5 )。我的应用程序需要一些多线程。为此,我使用.QThread()

我需要用互斥锁保护一些代码。我想我有以下两个选择:使用 Pythonthreading模块的锁或使用QMutex().

 

1. 使用 threading.Lock() 进行保护

这就是我制作互斥锁的方式:

以及我如何使用它:

您可以在此处找到 Python 文档:https ://docs.python.org/3/library/threading.html#threading.Lock

 

2. 使用 QMutex() 进行保护

要制作互斥锁:

以及如何使用它:

QMutex()你可以在这里找到 Qt5 文档: http ://doc.qt.io/qt-5/qmutex.html

 

3. 兼容性

我想知道:

  1. 是否threading.Lock()与用 制成的螺纹兼容QThread()

  2. QMutex()与普通的 Python 线程兼容吗?

换句话说,如果这些事情有点混在一起,这有什么大不了的吗?- 例如:一些python线程在应用程序中运行,在一些QThread的旁边,一些东西受保护threading.Lock(),其他东西受保护QMutex()

0 投票
2 回答
1462 浏览

c++ - QMutex:销毁锁定的互斥锁

给定以下代码:

最后...... 8),当我运行它时,所有的cout打印都是预期的,但我QMutex: destroying locked mutex在执行结束时得到一个。由于我收到消息finished waitingm_cond.wait因此(我认为)m_mutex将被解锁。但似乎并非如此。

如果我使用~Async() { m_mutex.unlock(); },我不会收到消息,但我认为不应该这样做。

请任何人解释为什么互斥锁没有被释放?

非常感谢!

0 投票
1 回答
417 浏览

qt - 如何修复“在 Qt 中将两个定时器变为一个函数,使用 qmutex 将 qeventloop 进行睡眠”

我有一些代码使用qtcpsocket读写,write-->sleep-->read;并且 ui 有 2 个或更多计时器来使用此功能;我希望我同步运行;所以我添加互斥锁来锁定它;由它陷入僵局;

qt4; qt5;

我希望我运行并输出为:登录乐趣...获得锁定乐趣...退出乐趣...登录乐趣...获得锁定乐趣...退出乐趣...

但它像这样运行:登录乐趣...获得锁定乐趣...登录乐趣.... ------------------------ - - - - -不再 - - - - - - - - - - -

0 投票
0 回答
98 浏览

qt - QMutex 被未知线程锁定

在下面的代码中,我得到一个 ASSERT in unlock (),因为lockingThreads (a QList<QThread*>) 不包含解锁(当前)线程。检查lockingThreads,我发现一个“ntdll”线程,我不知道它做了什么,只能访问不提供有用信息的反汇编。这个问题很难重现,所以感谢任何提示(可能是这个逻辑中的一个愚蠢的转折)。

编辑:互斥锁是递归的。

0 投票
1 回答
181 浏览

qt - QMutex::lock() 被同一个 QThread 连续多次占用

我有一个 QThread 从我的 main 产生,它正在设备上进行同步读取。读取有 1000 毫秒超时。读取被包装在一个永久循环中,并且读取受到 QMutex 的保护。基本代码是:

线程 1 - 在设备上永久读取

我有另一种在主事件循环下运行的方法,可以为 devicePointer 设置一些参数。在读取设备时这样做是不安全的,因此它会尝试获取锁,然后设置参数,然后解锁互斥锁。这将允许线程 1 读取循环继续。基本代码是:

线程 2 - 设置设备参数

当每个线程获取锁时,我在代码中有一些 qDebug 转储线程 ID。我看到的是线程 2 调用锁并阻塞,而线程 1 拥有锁并正在读取。线程 1 完成读取并解锁 Mutex。线程 1 继续循环的下一次迭代,并再次获得锁。线程 2 在readMutex.lock ()调用上保持阻塞。在线程 2 最终被允许获取锁并继续之前,这将有 5 或 6 次。

我假设 QMutex 使用循环法将线程排队,但线程 1 似乎并非如此,它能够在下一次迭代中取回锁。如果我在解锁后将QThread::msleep(250)添加到线程 1 的循环末尾,我可以强制线程 2 获取锁。睡眠可以解决问题,线程 2 能够立即获取锁并设置设备参数。

我做错了什么,这是优先事项吗?知道如何在不使用 msleep 将线程 1 置于后台的情况下通过线程进行循环吗?

0 投票
0 回答
95 浏览

multithreading - QThread,两个 QTimer 和 QMutex 死锁

我有带方法的 QObject,受 QMutex 保护。此方法可以直接从多个线程运行。而且我有另一个 QObject 与两个 QTimers 一起生活在另一个 QThread 中。计时器有不同的时间间隔和第一个对象的 timeout() 调用方法。

可能会发生,计时器同时到期并从同一线程锁定相同的 QMutex。怎么可能?为什么一个 QThread 会与自己并行运行代码?

我通过将计时器放在不同的线程中消除了这个问题。但是为什么QThread可以通过这种方式执行代码呢?

0 投票
1 回答
131 浏览

c++ - 以及将条件变量与本地互斥锁一起奇怪地使用

仔细研究旧项目和大型项目的遗留代码,我发现使用了一些奇怪的方法来创建线程安全队列,如下所示:

wakeOne从线程中用作“发布”功能”,并wait从其他线程调用并无限期地等待,直到消息出现在队列中。在某些情况下,线程之间的角色在不同阶段反转并使用单独的队列。

这甚至是QMutex通过创建本地方法来使用 a 的合法方式吗?我有点理解为什么有人可以在读取大小时这样做来避免死锁,que但它是如何工作的?有没有更简单、更惯用的方法来实现这种行为?

0 投票
5 回答
499 浏览

multithreading - 对于通过单个语句访问的变量,我是否需要 QMutex?

本文档中,QMutex 用于保护“数字”不被多个线程同时修改。我有一个代码,其中一个线程被指示根据另一个线程设置的标志做不同的工作。

我想知道是否需要 QMutex 来保护标志,即

该代码与文档的不同之处在于两个线程中通过单个语句访问(读取/写入)标志,并且只有一个线程修改标志的值。

PS: 我总是在多线程编程教程中看到一个线程执行“count++”,另一个线程执行“count--”的示例,并且教程说您应该使用互斥锁来保护变量“count”。我无法理解使用互斥锁的意义。是否意味着单条语句“count++”或“count--”的执行可以在中间被打断并产生意想不到的结果?能得到什么意想不到的结果?

0 投票
1 回答
1053 浏览

macos - Multipass 在 MacOS 和 multipassd 错误日志上完全崩溃

com.canonical.multipassd 服务不断在我的 Mac 上记录错误,即使重新安装、重新启动和更新我的 Mac,multipass 也根本无法工作。

为了通过多通道在 Linux VM 中使用我的 GPU,我尝试为我的卡(Radeon Pro 5300 4GB)安装 AMDGPU 驱动程序。我已经通过 brew 安装了 multipass 并取得了一些进展,但是./amdgpu-install由于缺少依赖项,该过程返回了各种错误。开始解决缺少的依赖项后,为了再次构建驱动程序,构建刚刚中途停止,我无法终止进程或让虚拟机响应(抱歉没有截屏)。

因此,我关闭了 VM shell 并尝试通过多通道关闭 VM。Multipass 完全停止响应 - 应用程序刚刚旋转,并且在终端中根本没有响应。我在活动监视器中强制退出多通道。那仍然没有解决它,所以我(有点愚蠢)强制退出“hyperkit”和“multipassd”。这是一切都出了问题的地方。

强制退出'multipassd'后,我尝试重新打开多通道,但它返回了以下错误

我查看了这个并尝试了一些建议的解决方案。我用 Brew 卸载了 multipass。我删除了应用程序,然后用 brew 重新安装。我也尝试过brew remove multipass,并尝试使用多通道网站上的 .pkg 进行安装。当那没有解决它时,我重新启动计算机并在启动时重置 NVRAM。这也没有什么不同,所以我刚刚将我的 Mac 更新到了 MacOS 11.4,但它仍然没有修复。

控制台日志表明它multipassd仍在做某事,因为它不断地登录到 system.log:

在多通道日志中,此消息也大约每 10 秒生成一次:

即使在重置 NVRAM 并重新启动后,也会生成这些消息。我认为它们是我启动 multipass 问题的原因,但我还没有找到任何解决方案来阻止它们,而且我无法识别任何仍在运行的与 multipass 相关的进程。就 brew 而言,未安装多通道,但它的日志仍在填满......

如果需要,很高兴提供控制台或终端输出 - 我的 Mac 上的其他任何东西似乎都没有损坏,我现在无法使用多通道。我确实有时间机器备份,所以如果可以保证修复它,我可能会求助于备份,但我不确定这是否一定会修复它,我宁愿找到替代解决方案。

正如这可能已经表明的那样,我对 Linux 和 VM 非常陌生……任何解决方案都非常感谢!