1

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

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

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

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

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

穆里洛 GK

4

3 回答 3

2

在 Qt 中,没有上下文切换就无法实现关键部分。

如果要在 Qt 中实现关键部分,只需使用QReadLockerQWriteLocker

于 2016-07-11T09:53:53.337 回答
0

那么这是我的问题:有没有办法在 Qt 中使用临界区?

Qt 替代方案是QMutex. 请注意,它比 Windows 的关键部分慢得多。根据我的经验,这就是为什么某些客户放弃在项目中使用 Qt 的一个主要问题。这是 Qt 的一部分,它比其他解决方案要慢得多。

我是否需要在要避免上下文切换的部分中放置互斥锁并将互斥锁放在其他地方?

那将是最 Qt'ish 的方式,但是 Qt'ish 并不一定意味着即使在 Qt 软件中也是最好的。您需要根据具体情况逐案判断。您需要问自己,在这种环境中,效率对您有多重要,以及您是否希望在(不久的?)将来支持多个平台。

如果是肯定的,我应该将这些互斥锁放在哪些部分?

这是一个通用的线程编程问题。当需要同步共享资源时使用线程原语。在这里,您可以阅读更多关于 Qt 线程的一般信息。

Qt 中的线程支持

我目前不确定你是否会在你的软件中使用 Qt 中的任何其他东西,但如果是的话,我建议放弃使用原生 Windows API 的想法,让初学者完成工作。如果 Qt 的使用成为您项目的瓶颈,您可以稍后再使用它。

于 2014-03-16T04:39:51.553 回答
0

那么这是我的问题:有没有办法在 Qt 中使用临界区?我是否需要在要避免上下文切换的部分中放置互斥锁

您似乎表示的是内核级关键部分,而不是仅处理并发执行的应用程序关键部分。内核级临界区仅处于内核模式,与用户应用程序无关。上下文切换是内核级别的想法,而不是用户模式。

如果您询问处理器亲和力,您必须使用操作系统特定的命令来设置它。Qt 不抽象处理器亲和性。这是确保您的进程在调度时不会在内核之间跳转的唯一方法。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686247%28v=vs.85%29.aspx

注意:在极少数情况下这些函数实际上是有用的。现代调度程序已经希望在之前运行的同一内核上重新调度给定线程,以最大限度地减少缓存未命中。

如果您询问多个线程对相同数据结构的并发访问,那么您正在寻找 QMutex 和类似的东西。

于 2014-03-17T05:46:28.370 回答