问题标签 [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 投票
2 回答
1224 浏览

multithreading - QMutex 在一个线程中锁定并在另一个线程中解锁

我是否可以以奇怪的方式使用 QMutex:将 QMutex 锁定在一个线程中,然后在另一个线程中解锁它?

0 投票
1 回答
1512 浏览

qt - QMutex - 这是否意味着我需要一个全局互斥变量

我需要实现一个以两种方式工作的互斥锁:1. 保护资源免受多个类的影响,以及 2. 保护资源免受类中的方法的影响,该类是插槽并且可能是可重入的。例如(伪 C++):

  1. 我读了这篇文章,上面说场景 2 被覆盖,因为 A.aaa 被 A.aaa 中断处理(不知何故 Qt/OS 知道它是被保护的同一个资源。对吧?

  2. 至于保护同一个资源的 A.aaa 和 B.bbb 我认为它不起作用,因为 Qt/OS 不知道它的同一个资源/互斥体?这是否意味着变量 mutex 需要是全局变量,以便多个不相关的类可以安全地访问它?

0 投票
1 回答
262 浏览

qt - QMutex - 在线程内保护但不在线程间保护

我需要保护资源不被中断,在这种情况下写入套接字。我有一个类 TelnetServer,它被实例化了很多次(每个使用的连接一次)。

我想防止对单个用户的写入被另一个对同一用户的写入中断(即锁定互斥锁以写入该一个套接字)。但是,我不想在写入单个用户时冻结对所有套接字的所有写入。澄清(伪c ++):

因此,如果我有 30 个 TelnetThread 正在运行,写入一个套接字不应阻止同时写入另一个线程。但是,如果几个插槽触发写入同一个套接字/线程,那么它们应该被序列化。

我应该在哪里声明我的互斥变量?如果我将其设为类(线程)变量,那不会序列化所有线程(此类的所有实例)上的所有套接字写入吗?如果我将其设为 writeToSocket 中的函数变量,那么我认为它不会将写入序列化,甚至写入同一个套接字。

帮助...我该怎么做?

0 投票
1 回答
592 浏览

c++ - Qt/C++ 共享变量和跨类实例的可见性

我正在努力解决一些非常基本的问题,我希望有人可以帮助澄清。以这个伪 C++ 代码为例:

  1. 如果我将此类实例化 3 次(作为 3 个线程),是否有 3 个独立且不相关的 M 和 I 变量?还是所有 3 个实例共享相同的 M 和 I 变量?

  2. 如果一个类有多个可重入方法(例如:槽),并且它们访问 M 或 I,它们是在访问该类的一个实例的 M 还是 I?

  3. 如何为类的每个实例赋予它自己的变量(其他实例无法访问)

0 投票
1 回答
3175 浏览

multithreading - 使用 QtConcurrent 运行函数时使用 QMutexLocker 保护共享变量

我使用 QtConcurrent 在后台线程中执行发现过程:

我以前没有放置 Mutex 来保护该函数内的共享变量,这些变量可以在后台线程运行时访问。这在我的“扫描”操作期间导致了一些随机锁定。

我现在已经实现了互斥锁,在该函数的开头创建了一个 QMutexLocker。

这会保护函数内的所有共享变量吗?或者,我应该在每个 m_* 变量周围显式使用 QMutex.lock() 和 unlock() 吗?

谢谢

0 投票
3 回答
440 浏览

c++ - QMutex , 如果线程正在运行,请在此处等待

我只想实现如下代码。

即使我用互斥锁写不同的线程也会得到相同的随机数。我怎么解决这个问题?谢谢。

0 投票
1 回答
36 浏览

multithreading - 互斥锁是否应该都添加到两个函数中,他们试图从不同的线程访问和写入相同的变量?

这是一个全局变量:

两个线程AB尝试访问并写入变量i ,线程A中的函数如下所示:

和线程B处理函数:

有两个线程只访问一个变量,我应该将QMutexLocker添加到两个函数中还是只添加一个?我可以加一个吗?

0 投票
3 回答
5576 浏览

c++ - 在 Qt 中处理关键部分

我已经搜索了很多这个问题的答案,但似乎没有。

我正在使用 Qt 5.2.0 制作带有 winsocks2 的 TCP 客户端。使用的语言是 C++。为了建立连接循环(我调用 send() 和 write()),我正在使用 QThread(可以在此处阅读http://qt-project.org/doc/qt-4.8/qthread.html),它是到目前为止运行良好,但我想确保当我的程序正在编写或读取某些内容时没有上下文切换。所以我认为关键部分是正确的方法,但是在我在互联网上的搜索中我没有找到任何方法来做到这一点,甚至在 Qt 官方文档中也没有提到关键部分。

那么这是我的问题:有没有办法在 Qt 中使用临界区?我是否需要在要避免上下文切换的部分中放置互斥锁并将互斥锁放在其他地方?如果是肯定的,我应该将这些互斥锁放在哪些部分?

对不起我的英语。提前致谢。

如果还有什么我可以告知的,请告诉我。

穆里洛 GK

0 投票
1 回答
3459 浏览

c++ - 可以将互斥锁功能标记为 const

Document我有代表自定义文档的线程安全类。它有 getter(const 函数)和 setter 来修改它的状态。所有这些函数都是互斥保护的,以保证在方法完全执行之前不会更改文档。

但由于QMutex使用情况,我无法将状态访问功能标记为constmutable使用。捕捉QMutex改变它的状态。

这段代码是正确的,还是可以用更好的方式编写?没有hackymutable用法。

0 投票
0 回答
956 浏览

qt - 无法获得对 QMutex 的锁定

我目前正在处理的应用程序是大量多线程的,具有在线程之间共享的许多资源。我使用 QMutex 来保护共享资源,但实际上在尝试同时锁定同一个互斥锁的不同线程之间应该很少发生争用。

然而,我发现我的应用程序会以一种令人不安的频率停止。当我中断执行并检查发生了什么时,我发现一个线程因为无法获得所需互斥锁的锁而停止。

我检查了互斥锁是否总是从同一个线程锁定和解锁 - 实际上,几乎总是在同一个花括号块内 - 在我最新一轮的故障排除中,我已经用定义的“nMutex”对象替换了所有裸 QMutex如下:

...并将我对 mutex.lock() 的所有调用替换为

我发现这经常失败,当它发生时它总是报告“locks = 0” - 换句话说,没有其他线程已经拥有互斥锁,但是试图获取它的线程却无法获取它. 失败似乎是随机发生的,无论在我的代码中对 mutex.lock() 的调用是在哪里进行的。

目前我可以看到两种可能性:

(1)我非常愚蠢,没有发现上述方法有什么问题,或者

(2) QMutex 中存在一个错误。这似乎不太可能,因为我没有看到任何报告,并且我已经在至少三个版本的 Qt 5.3 和 5.4(包括最新的 5.4.1)中尝试过这个。

有没有办法测试这两种可能性中哪一种最有可能是正确的?例如,在无法获得互斥体的情况下,有没有办法具体找出原因?