面試問題詳解十四:Qt 多線程同步【QSemaphore】講解

在多線程開發中,經常需要控制多個線程對共享資源的訪問數量。例如限制同時下載文件的數量、控制數據庫連接池的連接使用等等。這時候,Qt 提供的 QSemaphore(信號量)就非常派得上用場。


一、什么是 QSemaphore?

QSemaphore 是 Qt 中提供的一種線程同步工具。它通過內部維護一個資源計數器,允許多個線程同時訪問共享資源,但訪問數量受到限制

它與互斥鎖(QMutex)的區別在于:

  • QMutex 是互斥的,每次只允許一個線程進入臨界區。
  • QSemaphore 是限量的,可以允許多個線程同時訪問資源,但不會超過指定的最大數量。

可以把 QSemaphore 想象成一個“通行證發放器”:資源有限,有票的線程才能進入,無票的線程就只能等著。


二、典型應用場景

  • 同時最多只允許 N 個線程運行某項任務(例如下載器中最多允許 3 個并發下載)
  • 限制線程池中可用線程的最大數
  • 實現生產者-消費者模式中的緩沖區容量限制
  • 控制數據庫連接池的并發訪問數量

總之,任何需要限制并發訪問數量的場景,QSemaphore 都能派上用場。


三、常用方法說明

方法名說明
acquire(int n = 1)申請 n 個資源,不足則阻塞線程,直到資源可用
release(int n = 1)釋放 n 個資源,通知其他等待的線程
tryAcquire(int n = 1)嘗試申請 n 個資源,如果資源不足,立即返回 false
available()獲取當前可用的資源數量

四、實戰案例:限制同時運行線程數

目標說明

創建 10 個線程,每個線程執行一項任務。但系統最多只允許 3 個線程同時執行,其余線程必須等待已有線程完成任務后再開始執行。


C++ 代碼示例(基于 Qt)

#include <QCoreApplication>
#include <QThread>
#include <QSemaphore>
#include <QDebug>// 最大并發線程數設為 3
const int MAX_CONCURRENT = 3;
QSemaphore semaphore(MAX_CONCURRENT);// 自定義線程類
class Worker : public QThread
{int id;public:Worker(int id) : id(id) {}void run() override {// 申請資源,如果不足會阻塞semaphore.acquire();qDebug() << "線程" << id << "開始執行任務...";// 模擬任務耗時QThread::sleep(2);qDebug() << "線程" << id << "任務完成!";// 釋放資源semaphore.release();}
};int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);QList<Worker*> workers;// 啟動 10 個線程for (int i = 0; i < 10; ++i) {Worker* w = new Worker(i + 1);workers.append(w);w->start();}// 等待所有線程執行完成for (Worker* w : workers) {w->wait();delete w;}qDebug() << "所有任務執行完畢!";return 0;
}

程序輸出(示例)

線程1開始執行任務...
線程2開始執行任務...
線程3開始執行任務...
線程1任務完成!
線程4開始執行任務...
線程2任務完成!
線程5開始執行任務...
...
所有任務執行完畢!

可以看到:每次最多只有 3 個線程在執行任務,正是通過 QSemaphore 實現的并發控制。


五、代碼講解

  1. QSemaphore semaphore(MAX_CONCURRENT);
    初始化信號量對象,設定最大可用資源為 3,表示同時最多有 3 個線程能進入臨界區。

  2. semaphore.acquire();
    當前線程申請一個資源。如果當前資源不足(即已經有 3 個線程在運行),該線程會被阻塞。

  3. semaphore.release();
    當前線程完成任務后,釋放一個資源,讓其他等待中的線程可以繼續執行。


六、拓展建議

如果你希望進一步深入,可以嘗試以下拓展:

  • acquire() 替換為 tryAcquire(),實現非阻塞式資源申請邏輯
  • QThreadPoolQRunnable 結合使用,構建線程池限流機制
  • 配合 GUI,加入任務進度條,構建一個多任務調度界面
  • 使用更復雜的資源數量控制(例如一次申請多個資源)

七、總結

QSemaphore 是多線程控制中非常實用的一種同步機制,它能有效地控制線程對資源的并發訪問數量。相比于 QMutex 的一對一互斥,QSemaphore 提供了更靈活的“多對多”資源控制能力。

在并發任務調度、限流、連接池管理等場景中,都是非常實用的解決方案。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/95603.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95603.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/95603.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spark mapGroups 函數詳解與多種用法示例

mapGroups 是 Spark 中一個強大的分組操作函數&#xff0c;它允許你對每個分組應用自定義邏輯并返回一個結果。以下是多個使用簡單樣例數據的具體用法示例。基礎示例數據假設我們有一個簡單的學生成績數據集&#xff1a;// 創建示例DataFrame val studentScores Seq(("Ma…

【圖論】Graphs.jl 圖數據的讀寫與生成器

文章目錄圖數據的讀寫Graphs.loadgraphGraphs.loadgraphsGraphs.savegraph保存單個圖保存圖字典Graphs.loadlg_multGraphs.savelgGraphs.savelg_mult圖的生成器1. 隨機圖模型1.1 Erd?s–Rnyi 模型1.2 巴拉巴西-阿爾伯特模型 (無標度網絡)1.3 小世界網絡模型1.4 隨機塊模型 (SB…

Go指針全解析:從基礎到實戰

基本概念與定義指針的定義指針是一種特殊的變量類型&#xff0c;它存儲的不是實際數據值&#xff0c;而是另一個變量在計算機內存中的地址。在底層實現上&#xff0c;指針本質上是保存內存位置的無符號整數&#xff0c;它直接指向內存中的特定位置&#xff0c;允許程序直接操作…

Oracle 查詢有哪些用戶 提示用戶名密碼無效

要查詢 Oracle 數據庫中的所有用戶&#xff0c;可以使用以下 SQL 查詢語句。這個查詢將返回數據庫中所有用戶的列表。 [] SELECT username FROM all_users ORDER BY username;如果你有足夠的權限&#xff08;通常是 DBA 權限&#xff09;&#xff0c;你也可以使用 dba_users 視…

小白成長之路-develops -jenkins部署lnmp平臺

文章目錄一、準備工作1.1兩臺虛擬機1.2配置文件1.3免密登錄二、實戰1.構建主item2.測試nginx,php,mysql2.1新建測試項目2.2與正式項目綁定構建后的操作2.3測試2.4導入discuz項目總結一、準備工作 1.1兩臺虛擬機 服務器&#xff1a;192.168.144.24 客戶端&#xff1a;192.168.…

【HarmonyOS 6】仿AI喚起屏幕邊緣流光特效

【HarmonyOS 6】仿AI喚起屏幕邊緣流光特效 一、前言 最近在做 HarmonyOS 6.0 的適配&#xff0c;發現 Beta1版本里多了個很實用的視效功能——自帶背景的雙邊流光。 之前做屏幕邊緣流光特效的時候&#xff0c;要么得自己寫漸變動畫拼效果&#xff0c;要么就得套好幾個組件疊層&…

跟做springboot尚品甄選項目

springbootvue3 【尚硅谷Java項目《尚品甄選》 SpringBootSpringCloud萌新學會企業級java項目】003.后臺系統-搭建前端環境&#xff08;工程創建&#xff09;_嗶哩嗶哩_bilibili E:\project\AllProJect\Shangpin Selection\項目材料素材\課件\尚品甄選項目課件 前端套用框架…

【Linux】創建線程

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 文章目錄 一、為什么需要線程&#xff1f; 創建線程 示例&#xff1a;計算斐波恩夕法 一、為什么需要線程&#xff1f; 在多核處理器的計算機上&#xff0c;線程可…

HTML應用指南:利用POST請求獲取全國九號電動車體驗店服務店位置信息

九號公司(Ninebot)作為全球領先的智能短途出行解決方案提供商,始終秉持“智慧移動,愉悅生活”的品牌理念,致力于為個人用戶打造安全、智能、時尚的城市出行體驗。依托“智能硬件 + 數字服務 + 線下觸點”三位一體的戰略布局,九號公司已建立起覆蓋全國、輻射全球的銷售與服…

Kafka面試精講 Day 4:Consumer消費者模型與消費組

【Kafka面試精講 Day 4】Consumer消費者模型與消費組 在“Kafka面試精講”系列的第四天&#xff0c;我們將深入探討Kafka的核心組件之一——Consumer消費者模型與消費組&#xff08;Consumer Group&#xff09;。這是Kafka實現高吞吐、可擴展消息消費的關鍵機制&#xff0c;也…

使用 Uni-app 打包 外鏈地址APK 及 iOS 注意事項

本文詳細介紹了如何使用 Uni-app 框架將項目打包為 Android APK 和 iOS 應用&#xff0c;重點講解了 minSdkVersion、targetSdkVersion 和 abiFilters 的配置&#xff0c;以及 iOS 開發的注意事項。文章還包含了您提供的 WebView 示例代碼&#xff0c;并提供了關鍵的注意事項&a…

異常處理小妙招——3.構造函數的安全第一原則:為什么不在構造函數中拋出異常?

文章目錄災難性的生日派對構造函數&#xff1a;對象的出生證明安全第一&#xff1a;嚴格的出生檢查為什么要在構造函數中嚴格驗證&#xff1f;1. 避免"僵尸對象"2. Fail-Fast&#xff08;快速失敗&#xff09;原則現實世界的實踐建議1. 使用工廠方法模式2. 使用Build…

iptables 和 ip route

文章目錄iptables原理及常用命令表鏈鏈表鏈表總結iptables 常用命令及參數1. 規則管理命令 (Commands)2. 規則匹配參數 (Rule-Specification - Matches)3. 目標動作參數 (Target)命令示例配置流程示例ip route常用命令iptables和ip route的聯系實用命令示例對比iptables原理及常…

RPC和HTTP的區別?

RPC和HTTP是兩種不同的通信協議&#xff0c;它們在通信方式、性能效率以及靈活性可擴展性等方面存在區別。以下是具體分析&#xff1a; 通信方式 RPC&#xff1a;RPC是基于遠程過程調用的二進制協議&#xff0c;它允許客戶端像調用本地函數一樣調用遠程服務器上的函數或方法[2]…

貝葉斯分類(Bayes Classify)

一. 核心思想貝葉斯分類是一類基于貝葉斯定理&#xff08;Bayes Theorem&#xff09;和概率統計的分類算法&#xff0c;核心思想是 “通過已知的先驗概率&#xff0c;結合數據的似然性&#xff0c;計算后驗概率&#xff0c;最終將樣本歸為后驗概率最高的類別”。它在機器學習、…

怎么熟悉業務,我是做前端的,但對業務了解沒有渠道

作為前端開發者&#xff0c;想深入了解業務但“沒有渠道”&#xff0c;這是非常普遍的痛點。很多前端同學只接到“切圖實現頁面”的任務&#xff0c;久而久之就成了“實現工具人”。但業務理解力&#xff0c;恰恰是區分“初級”和“高級”前端的核心分水嶺。 好消息是&#xff…

如何批量在PDF文檔最后一頁蓋章?

在面對上百份需要處理的 PDF 文檔時&#xff0c;逐個打開文檔蓋章再進行保存&#xff0c;這些步驟不僅提高我們工作的繁瑣&#xff0c;還容易導致處理位置錯誤或遺漏。那么怎么去將 PDF 文檔末頁實現批量自動打上電子印章&#xff1f;一般的方式沒有辦法來滿足我們高效率辦公的…

Keras/TensorFlow 中 `predict()` 函數詳細說明

Keras/TensorFlow 中 predict() 函數詳細說明 predict() 是 Keras/TensorFlow 中用于模型推理的核心方法&#xff0c;用于對輸入數據生成預測輸出。下面我將從多個維度全面介紹這個函數的用法和細節。 一、基礎語法和參數 基本形式 predictions model.predict(x,batch_sizeNon…

題解:UVA1589 象棋 Xiangqi

看到代碼別急著走&#xff0c;還要解釋呢&#xff01;哈哈&#xff0c;知道這個題我是怎么來的嗎&#xff1f;和爸爸下象棋20場輸17場和2場QWQ于是乎我就想找到一個可以自動幫我下棋的程序&#xff0c;在洛谷上面搜索&#xff0c;就搜索到了這個題。很好奇UVA的為啥空間限制是0…

基于YOLOv11的腦卒中目標檢測及其完整數據集——推動智能醫療發展的新機遇!

在當今科技迅速發展的時代&#xff0c;腦卒中作為一種嚴重威脅人類健康的疾病&#xff0c;其早期的檢測和及時的干預顯得尤為重要。為此&#xff0c;本項目推出基于YOLOv11的腦卒中目標檢測系統&#xff0c;結合完整的數據集&#xff0c;不僅提高了檢測的效率&#xff0c;更為醫…