我经常搜索这个问题的答案,但似乎没有。
我使用Qt 5.2.0使用winsocks2创建TCP客户端。使用的语言是C ++。为了建立连接循环(我称之为send()和write())我使用QThread(可以在这里阅读http://qt-project.org/doc/qt-4.8/qthread.html),它到目前为止运作良好,但我想要确保在我的程序正在编写或阅读某些内容时没有上下文切换。因此,我认为关键部分是正确的方式,但在我在互联网上搜索时,我还没有找到任何办法,甚至在Qt官方文档中也没有提及关键部分。
然后我的问题是:有没有办法在Qt中使用关键部分?我是否需要在我希望避免上下文切换的部分中放置互斥锁并将互斥锁放在其他位置?如果是肯定的,我应该在哪些部分放置这些互斥量?
对不起我的英语。提前谢谢。
如果还有其他更多信息,请告诉我。
Murilo G. K.
答案 0 :(得分:1)
在Qt中,如果没有上下文切换,就无法实现关键部分。
如果您想在Qt中实施关键部分,只需使用QReadLocker和QWriteLocker。
答案 1 :(得分:0)
然后我的问题是:有没有办法在Qt中使用关键部分?
Qt替代方案是QMutex
。请注意,它比Windows的关键部分慢得多。这是一个主要的严峻原因,根据我的经验,某些客户在项目中使用Qt。这是Qt的一部分,它变得比替代解决方案慢得多。
我是否需要在我希望避免上下文切换的部分中放置互斥锁并将互斥锁放在其他位置?
这将是最Qt'ish方式,但Qt'ish并不一定意味着即使在Qt软件中最好。您需要根据具体情况逐案判断。您需要问问自己在这种环境中效率对您有多重要,以及您是否希望在(接近?)未来支持多个平台。
如果是肯定的,我应该在哪些部分放置这些互斥量?
这是一个通用的线程编程问题。需要同步共享资源时使用线程原语。在这里,您可以阅读更多关于Qt线程的信息。
我目前不确定你是否会在你的软件中使用Qt中的任何其他东西,但如果是的话,我建议放弃本机Windows API用于启动器的想法以完成任务。如果Qt使用成为项目的瓶颈,您可以随后再回到它。
答案 2 :(得分:0)
然后我的问题是:有没有办法使用关键部分 在Qt?我是否需要在我想要的部分中添加互斥量避免上下文 切换强>
您似乎指出的是内核级关键部分,而不是仅处理并发执行的应用程序关键部分。内核级关键部分仅在内核模式 中,与用户应用程序无关。上下文切换是内核级别的想法,而不是用户模式。
如果您询问处理器关联性,则必须使用特定于操作系统的命令来设置它。 Qt不会抽象处理器亲和性。这是确保您的进程在调度时不会在核心之间跳转的唯一方法。
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686247%28v=vs.85%29.aspx
注意:这些功能实际上很有用的情况很少。现代调度程序已经希望在之前运行的同一个核心上重新安排给定线程,以最大限度地减少缓存未命中。
如果您询问多个线程对同一数据结构的并发访问,那么QMutex和您正在寻找的类似。