多线程
Qt 下多线程有以下方法:
-
- 从 QThread 派生:
继承 QThread
在子类中重写 run 函数
创建子类对象并调用 start() 函数
-
- 使用业务类:
在主线程中创建一个 QThread 对象
在主线程中创建业务类对象
使用 moveToThread 将业务类移动到子线程
使用信号和槽处理业务
使用 run:
QFuture<void> fut1 = QtConcurrent::run(processFun, command);
processFun 为线程回调函数
另外,还有线程池。线程池可以使用全局线程池或者本地线程池。线程池可以传入 QThread 或者 Lambda 表达式。可以调用 waitForDone 阻塞线程至所有线程退出。 Lambda 只能传入一个参数,但是可以使用 std::bind 传入多个参数
多线程中有以下需要注意的事项:
业务对象在创建时不能指定父对象
UI 线程只能在主线程中处理
QMutex
由于 QMutex 是围绕 futex 设计的,因此其在无竞争的条件下是不会陷入内核态的,这点要比 std::mutex 高效
-
Performance of std::mutex and QMutex in MinGW 64 (posix thread version)]