深入理解QT并發(fā)機(jī)制
QT 提供了多種并發(fā)編程機(jī)制,使得開發(fā)者能夠充分利用多核處理器優(yōu)勢(shì),同時(shí)保持代碼的可維護(hù)性和跨平臺(tái)特性。以下是 QT 主要的并發(fā)機(jī)制:
1. QThread - 線程基礎(chǔ)類
QThread 是 QT 中最基礎(chǔ)的線程類,提供了創(chuàng)建和管理線程的能力。
class WorkerThread : public QThread {
void run() override {
// 在這里執(zhí)行耗時(shí)操作
qDebug() << "Worker thread running";
}
};
// 使用
WorkerThread *thread = new WorkerThread;
thread->start(); // 啟動(dòng)線程2. 基于 QObject 的線程模型
更推薦的方式是將 QObject 移動(dòng)到線程中:
class Worker : public QObject {
Q_OBJECT
public slots:
void doWork() {
// 執(zhí)行耗時(shí)任務(wù)
emit resultReady(result);
}
signals:
void resultReady(const QString &result);
};
// 使用
QThread *thread = new QThread;
Worker *worker = new Worker;
worker->moveToThread(thread);
connect(thread, &QThread::started, worker, &Worker::doWork);
connect(worker, &Worker::resultReady, [](const QString &result){
// 處理結(jié)果
});
thread->start();3. QtConcurrent - 高級(jí)并發(fā)API
QtConcurrent 提供了更高層次的并發(fā)編程接口:
// 并行映射
QList<int> list = {1, 2, 3, 4, 5};
QFuture<void> future = QtConcurrent::map(list, [](int &x){
x *= 2;
});
future.waitForFinished(); // 等待完成
// 并行過濾
QFuture<int> filtered = QtConcurrent::filtered(list, [](int x){
return x > 5;
});
// 并行歸約
int sum = QtConcurrent::blockingReduced(list, [](int &result, int x){
result += x;
});4. QThreadPool 和 QRunnable
對(duì)于任務(wù)隊(duì)列模式:
class Task : public QRunnable {
void run() override {
// 執(zhí)行任務(wù)
}
};
// 使用
Task *task = new Task;
QThreadPool::globalInstance()->start(task);5. 線程同步機(jī)制
QT 提供了多種線程同步工具:
QMutex - 互斥鎖
QMutex mutex; mutex.lock(); // 臨界區(qū)代碼 mutex.unlock(); // 或使用 QMutexLocker QMutexLocker locker(&mutex); // 臨界區(qū)代碼
QReadWriteLock - 讀寫鎖
QReadWriteLock lock; lock.lockForRead(); // 多個(gè)讀取 lock.lockForWrite(); // 單個(gè)寫入
QSemaphore - 信號(hào)量
QSemaphore sem(5); // 5個(gè)資源 sem.acquire(3); // 獲取3個(gè) sem.release(2); // 釋放2個(gè)
QWaitCondition - 條件變量
QWaitCondition condition; QMutex mutex; // 等待線程 mutex.lock(); condition.wait(&mutex); mutex.unlock(); // 喚醒線程 condition.wakeOne(); // 或 wakeAll()
6. 線程間通信
信號(hào)槽機(jī)制:QT 的自動(dòng)連接方式默認(rèn)是隊(duì)列連接(Qt::QueuedConnection),可以安全地跨線程通信
QMetaObject::invokeMethod:跨線程調(diào)用方法
QMetaObject::invokeMethod(object, "methodName",
Qt::QueuedConnection,
Q_ARG(QString, "param"));7. 異步操作
QFuture 和 QFutureWatcher 用于監(jiān)控異步操作
QFuture<int> future = QtConcurrent::run([](){
return 42;
});
QFutureWatcher<int> *watcher = new QFutureWatcher<int>;
connect(watcher, &QFutureWatcher<int>::finished, [](){
qDebug() << "Done";
});
watcher->setFuture(future);最佳實(shí)踐
- 避免直接繼承 QThread,推薦使用 moveToThread
- 主線程只用于 GUI 操作,耗時(shí)操作放在工作線程
- 使用信號(hào)槽進(jìn)行線程間通信,避免直接共享數(shù)據(jù)
- 使用 QMutexLocker 等 RAII 類管理鎖資源
- 考慮使用 QtConcurrent 簡化并行算法實(shí)現(xiàn)
到此這篇關(guān)于深入理解QT并發(fā)機(jī)制的文章就介紹到這了,更多相關(guān)QT并發(fā)機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C++編程中的單目運(yùn)算符重載與雙目運(yùn)算符重載
這篇文章主要介紹了詳解C++編程中的單目運(yùn)算符重載與雙目運(yùn)算符重載,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-09-09
嵌入式C語言輕量級(jí)程序架構(gòu)內(nèi)核編寫
這篇文章主要介紹了嵌入式C語言輕量級(jí)程序架構(gòu)內(nèi)核編寫,文章將讓大家學(xué)到輕量級(jí)程序架構(gòu)的內(nèi)核實(shí)現(xiàn)原理、輕量級(jí)程序架構(gòu)的設(shè)計(jì)思想、了解單片機(jī)常用的程序架構(gòu)等更多C語言輕量級(jí)程序架構(gòu)相關(guān)內(nèi)容,需要的朋友可以參考一下2022-03-03
C指針原理教程之編譯原理-小型計(jì)算器實(shí)現(xiàn)
本文給大家分享的是如何使用C語言編寫一個(gè)小型計(jì)算器的實(shí)例代碼,有需要的小伙伴可以參考下2019-02-02
淺析棧區(qū)和堆區(qū)內(nèi)存分配的區(qū)別
以下是對(duì)棧區(qū)和堆區(qū)內(nèi)存分配的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-08-08
C語言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要介紹了C語言學(xué)生學(xué)籍管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
QT實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了QT實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
VC實(shí)現(xiàn)五子棋游戲的一個(gè)算法示例
這篇文章主要介紹了VC實(shí)現(xiàn)五子棋游戲的一個(gè)算法示例,對(duì)于學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的朋友有一定的借鑒價(jià)值,需要的朋友可以參考下2014-08-08

