QThread 与 std::thread

新手上路,请多包涵

我在“pthread vs std::thread”和“QThread vs pthread”上看到了不同的主题,但在“std::thread vs QThread”上没有看到。

我必须编写一个软件来驱动 3D 打印机并且需要使用线程。将有一个线程不断检查安全性,另一个执行打印过程,一些用于单独驱动每个硬件组件(运动,喷射,…),等等……该程序是为 Windows 开发的 C++11 /Qt。

首先,我想使用 QThread,但 在我看来,QThread 不允许您做与 std::thread 一样多的事情,例如,在阅读 Anthony Williams 的“C++ Concurrency in Action”时,我发现这是可能的通过执行类似 std::thread t1(&Class::function, this, ...); 类的操作来要求 std::thread 从另一个线程执行函数,这对于 QThread 似乎是不可能的。

我最想拥有的机制是一种表示我是否希望在当前线程或另一个线程中执行函数的方式。

你会选择哪一个,为什么?

原文由 ElevenJune 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

QThread 不仅仅是一个线程,它还是一个线程管理器。如果你想让你的线程玩 Qt,那么 QThread 是要走的路。 Qt 是事件驱动的,就像大多数现代编程一样。这比“使线程运行函数”更复杂和灵活。

在 Qt 中,您通常会与 QThread 一起创建一个工作者,将工作者移动到该线程,然后事件系统为该工作者对象调用的每个函数都将在工作者对象拥有的线程中执行对的亲和力。

So you can encapsulate your functionality in different worker object, say SafetyChecker , Printer , ServoDriver , JetDriver and so on, create an instance每个,将其移动到一个专用线程,你就设置好了。您仍然可以调用会“阻塞”而不是使用细粒度事件的函数,并使用原子或互斥体来进行线程间同步。只要您不阻塞主/ gui线程,这没有任何问题。

您可能不想让您的打印机代码事件驱动,因为在涉及排队连接的多线程场景中,这比直接连接甚至虚拟调度要慢一些。如此之多,以至于如果您将多线程设置得太细,您实际上可能会遇到巨大的性能损失。

话虽这么说,使用 Qt 的非 gui 东西有其自身的优点,它可以让您更轻松地进行更清洁和更灵活的设计,并且如果您正确实施,您仍然可以获得多线程的好处。您仍然可以使用事件驱动的方法来管理整个事情,这比仅使用 std::thread 容易得多,后者是一个低得多的层次结构。您可以使用事件驱动的方法来设置、配置、监视和管理设计,而关键部分可以在辅助线程中的阻塞函数中执行,以尽可能低的同步开销实现细粒度控制。

澄清一下 - 答案不关注异步任务执行,因为其他两个答案已经这样做了,而且正如我在评论中提到的那样,异步任务并不是真正用于控制应用程序。它们适合执行小任务,这仍然比您想要阻止主线程花费更多的时间。作为推荐的准则,所有耗时超过 25 毫秒的事情都最好异步执行。而打印可能需要几分钟甚至几小时,并且意味着连续运行控制功能,并行和使用同步。异步任务不会为您提供控制应用程序的性能、延迟和顺序保证。

原文由 dtech 发布,翻译遵循 CC BY-SA 3.0 许可协议

QThread 如果你想将线程集成到 Qt 系统中很好(比如必须发出信号或连接到某些插槽)

尽管 QThread 的布局仍然是制作的,因此它可以与“旧”c++一起使用。您必须创建一个类和所有这些开销(代码和打字方式)只是为了在线程中运行。

如果您只是想启动一个线程,我认为 c++11 std::thread 是您必须编写的不那么冗长/代码。您可以只使用 lambda 或函数指针,并且可以提供任意数量的参数。因此,对于简单的线程,我建议在 QThreads 上使用 c++11 线程。

当然,您更喜欢哪一个可能是一个意见问题。


尽管 Qt 有几个不同的高级线程对象,但 C++ 没有。如果您需要其中一些而不是基本线程,或者您可能根本不需要基本线程但那些更适合您,您可能想要研究这些。

就像 QThreadPool 或者只是 QTimer 如果你需要等待的话。 是一些关于 Qt 中裸线程替代方案的阅读材料。

QConcurrent 也更接近于 c++11 futureasync 例如,它还具有可以运行的可选线程池。

原文由 Hayt 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题