我在“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 许可协议
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 毫秒的事情都最好异步执行。而打印可能需要几分钟甚至几小时,并且意味着连续运行控制功能,并行和使用同步。异步任务不会为您提供控制应用程序的性能、延迟和顺序保证。