一直对这方面不太清楚,最近学习了一下Qt的多线程,网络上有很多相关博客,在这里记录一下看到的优秀的博客和资料。
优秀的博客资料:
Qt 中的多线程技术:这篇博客从线程概念的起源讲到访问数据所面临的挑战,最后引入Qt 提供的多线程操作及其适用场景。
Qt 多线程编程之敲开 QThread 类的大门:详细讲述了QThread 及其操作,也指出了QThread 和moveToThread() 的正确使用方法。
Qt 多线程编程之降低线程的开销:详细讲述了线程池QThreadPool,及其本质。
Qt多线程编程之高级函数:讲述了Qt提供的高级API ,Qt Concurrent模块。
Qt官方资料
Qt中的线程支持:是相关内容的目录概览,包括几篇文章和涉及的类的链接。
主要是这几篇,比较全面:
虽然是英文的,但用谷歌进行网页翻译后,根据机翻结果对照着英文原文进行阅读,也没有什么障碍存在。
另外,学习多线程前最好先了解Qt的元对象系统和事件机制。
QThread:具有可选事件循环的低级API
- QThread是Qt中所有线程控制的基础。每个QThread实例代表并控制一个线程。
- QThread可以直接实例化也可以子类化。实例化QThread提供了一个并行事件循环,从而允许在辅助线程中调用QObject槽。子类化QThread允许应用程序在开始其事件循环之前初始化新线程,或者在没有事件循环的情况下运行并行代码。
QThreadPool和QRunnable:重用线程
- 频繁创建和销毁线程可能会很昂贵。为了减少这种开销,可以将现有线程重用于新任务。QThreadPool是可重用的QThreads的集合。
- 要在QThreadPool的线程之一中运行代码,请重新实现QRunnable :: run()并实例化子类QRunnable。使用QThreadPool :: start()将QRunnable放入QThreadPool的运行队列中。当线程可用时,QRunnable :: run()中的代码将在该线程中执行。
- 每个Qt应用程序都有一个全局线程池,可以通过QThreadPool :: globalInstance()访问它。该全局线程池会根据CPU中的内核数自动维护最佳线程数。但是,可以显式创建和管理单独的QThreadPool。
Qt Concurrent:使用高级API
- Qt Concurrent模块提供的高层次的函数。
- 与使用QThread和QRunnable不同,这些函数从不需要使用低级线程原语,例如互斥量或信号量。相反,它们返回一个QFuture对象,当准备就绪时,该对象可用于检索函数的结果。QFuture还可以用于查询计算进度以及暂停/恢复/取消计算。为了方便起见,QFutureWatcher支持通过信号和槽与QFutures进行交互。