C++條件變量學習

1、概述

你知道條件變量"虛假喚醒"問題么,下面代碼有問題么

void CFileTaskThread::Run()
{while (!m_bStop){CFileItemRequest* pFileItem;{std::unique_lock<std::mutex> guard(m_mtItems);if (m_Filelist.empty()){if (m_bStop)return;// 等待條件滿足m_cvItems.wait(guard);}pFileItem = m_Filelist.front();m_Filelist.pop_front();}// do something}
}

2、分析

上述代碼,當列表?m_Filelist?為空時,調用?wait?進入阻塞狀態,等待條件變量被觸發。一旦其他線程通過?notify_one()?或?notify_all()?發出通知,wait?函數解除阻塞并返回。隨后,從列表頭部取出一個任務繼續執行。

虛假喚醒:

一個線程正在調用std::condition_variable::wait()等待,沒有任何線程調用notify_one()或notify_all情況下,wait函數解除阻塞并返回了。

如果是虛假喚醒場景,那么上述代碼就會有問題,當wait函數返回后,準備從列表頭部取出一個任務,而此時列表是空的,程序就崩潰了。

正確寫法

循環中使用?while?檢查條件可以防止虛假喚醒。即使線程被意外喚醒,while?會再次檢查列表是否為空。如果列表仍然為空,線程會繼續調用?wait?并保持等待狀態,直到條件真正滿足。

void CFileTaskThread::Run()
{while (!m_bStop){CFileItemRequest* pFileItem;{std::unique_lock<std::mutex> guard(m_mtItems);// 注意注意,這里用whilewhile (m_Filelist.empty()){if (m_bStop)return;// 等待條件滿足m_cvItems.wait(guard);}pFileItem = m_Filelist.front();m_Filelist.pop_front();}// do something}
}

學習鏈接:https://github.com/0voice

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

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

相關文章

React Native系統組件(一)

1&#xff0c;View&#xff0c;UI的構建基石 四個方向&#xff0c;水平&#xff0c;水平倒序&#xff0c;垂直&#xff0c;垂直倒序 flexGrow與flex的區別&#xff0c;flexgrow是分父布局剩余的空間&#xff0c;flex是分父布局全部的空間上面的是flexgrow 123 下面的是flex 123…

Git 代碼提交管理指南

目錄 1. 初始設置&#xff08;首次使用 Git 時&#xff09; 2. 日常提交工作流程 場景一&#xff1a;已有本地項目&#xff0c;首次連接到遠程倉庫 場景二&#xff1a;已有遠程倉庫&#xff0c;克隆到本地 3. 更精細的文件管理 4. 提交信息規范 5. 分支管理策略 6. 高級…

go-mapus最簡單的離線瓦片地圖協作

基于leaflet.jsleaflet-geoman.jsgolangbeegogormsqlitewebsocket等實現一個最簡單的地圖協作。繪制圖元&#xff0c;其他用戶瀏覽器上實施顯示繪制和修改結果&#xff0c;大家可同步進行繪制和修改。設置線型和顏色&#xff0c;粗細和透明度。保存到sqlite數據庫。動畫演示地圖…

調式記錄之八位機軟件串口

現在在上班&#xff0c;做的項目幾乎都是關于八位機的&#xff0c;八位機有個挺CD的點硬件資源少&#xff0c;打印之類的需要軟件串口&#xff0c;有時候調的剛到很玄學&#xff0c;也有可能是我知識沒有學得恨透。首先我得需要發送這句話并在代碼里面設置我的延時時間&#xf…

嵌入式學習day40-硬件(1)

嵌入式&#xff1a;以應用為中心&#xff1a;消費電子(手機、藍牙耳機、智能音響&#xff09;、醫療電子(心率脈搏、呼吸機&#xff09;、無人機&#xff08;大疆DJ&#xff09;、機器人&#xff08;人形四足機器人)計算機技術&#xff1a;計算機五大組成&#xff1a;運算器(數…

管理中心理學問:面試中教你識別他人需求動機

“我工作是為了錢&#xff0c;為了吃,住&#xff0c;和用錢買東西。”“我工作是為了地位和認可。”“我工作是為了有所歸屬&#xff0c;為了成為一個團體的成員。”“我工作是想高升。”“我工作是因為人應該工作&#xff0c;這是唯一的權利。”“我工作為了獲取知識和認識世界…

【JavaScript】讀取商品頁面中的結構化數據(JSON-LD),在不改動服務端情況下,實現一對一跳轉

前端實踐&#xff1a;從商品頁面讀取 mpn 并實現一對一跳轉 在實際開發中&#xff0c;我們經常會遇到這樣一種需求&#xff1a; 用戶瀏覽 A 網站的商品頁面后&#xff0c;點擊按鈕能夠直接跳轉到 B 網站的對應商品。 表面看似只是一個按鈕跳轉&#xff0c;但如果不同商品需要精…

HTML5實現好看的邀請函網頁源碼

HTML5實現好看的邀請函網頁源碼 前言一、設計來源1.1 邀請函主頁1.2 邀請函活動信息1.3 邀請函內容1.4 邀請函活動地址1.5 邀請函活動流程1.6 邀請函活動獎勵1.7 邀請函聯系我們 二、效果和源碼2.1 動態效果2.2 源代碼 結束語 HTML5實現好看的邀請函網頁源碼&#xff0c;酷炫的…

傳輸層TCP 與 安全層SSL/TLS

本章節主要探討三個問題&#xff1a;1. SSL/TSL 的區別和聯系是什么&#xff1f;2. 我們常說的 “三次握手” 發生在哪個階段&#xff0c;SSL/TSL層有參與嗎?3. HTTPS混合加密發生在哪個層?一、SSL 和 TLS 聯系繼承關系&#xff1a;TLS 直接基于 SSL 3.0 設計&#xff0c;可以…

【數學建模學習筆記】時間序列分析:ARIMA

零基礎看懂 ARIMA 模型&#xff1a;從原理到實戰如果你完全沒接觸過 “時間序列預測”&#xff0c;也不懂復雜公式&#xff0c;這篇會用 “說人話” 的方式幫你搞懂 ARIMA 模型&#xff0c;以及文中代碼到底在做什么。一、先搞懂&#xff1a;ARIMA 是用來干嘛的&#xff1f;簡單…

【macOS】垃圾箱中文件無法清理的“含特殊字符文件名”的方法

【macOS】垃圾箱中文件無法清理的“含特殊字符文件名”的方法文件名包含特殊字符&#xff08;如空格、中文符號等&#xff09;導致終端無法正確識別文件路徑。 可以嘗試以下解決方法&#xff1a;使用文件路徑自動補全輸入 rm &#xff08;注意 rm 后有空格&#xff09;&#xf…

???????Blender 重拓撲修改器實戰指南:從基礎操作到細節優化?

在 Blender 建模中&#xff0c;重拓撲是解決 “高模難編輯、低模細節差” 的關鍵。傳統手動重拓撲效率低&#xff0c;重拓撲修改器能自動生成規整拓撲&#xff0c;保留模型外形&#xff0c;適合游戲資產、動畫角色等場景。 一、核心作用與適用場景? 重拓撲修改器并非 “一鍵完…

C/C++哆啦A夢

寫在前面 用代碼繪制童年記憶中的那個藍胖子——哆啦A夢&#xff0c;是我對經典角色的一次深情致敬。這段程序不僅是一幅靜態圖像的生成&#xff0c;更是一次對童年幻想世界的數字重建。通過精確的幾何控制與色彩搭配&#xff0c;我將那個圓潤可愛、溫暖可靠的機器人重新帶回眼…

CSS入門指南:30字掌握核心技巧

1. CSS初體驗 1.1. CSS定義 層疊樣式表 (Cascading Style Sheets&#xff0c;縮寫為 CSS&#xff09; 用來描述 HTML 文檔的呈現&#xff08;美化內容&#xff09; 1.2. CSS引入方式 內部樣式表&#xff1a;學習使用 CSS 代碼寫在head里面的 style標簽 里面 外部樣式表&…

從實操到原理:一文搞懂 Docker、Tomcat 與 k8s 的關系(附踩坑指南 + 段子解疑)

目錄 一、先分清&#xff1a;Docker、Tomcat、k8s 到底是 “干啥的”&#xff1f; 二、它們的 “合作關系”&#xff1a;從 Java 項目到集群部署的全流程 三、實際應用場景&#xff1a;什么時候該用誰&#xff1f; 1. 單獨使用場景 2. 組合使用場景&#xff08;最常見&…

測試覆蓋率不夠高?這些技巧讓你的FastAPI測試無懈可擊!

url: /posts/0577d0e24f48b3153b510e74d3d1a822/ title: 測試覆蓋率不夠高?這些技巧讓你的FastAPI測試無懈可擊! date: 2025-09-02T01:49:10+08:00 lastmod: 2025-09-02T01:49:10+08:00 author: cmdragon summary: FastAPI通過TestClient工具支持單元測試,模擬HTTP請求直接…

Qwen3-Reranker-0.6B 模型結構

模型加載 import torch from modelscope import AutoModel, AutoTokenizer, AutoModelForCausalLMtokenizer AutoTokenizer.from_pretrained("Qwen/Qwen3-Reranker-0.6B", padding_sideleft) model AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-Reranke…

無參 MOS 算法的評估方式

一、無參 MOS 算法 在音頻處理和質量評估領域&#xff0c;MOS&#xff08;Mean Opinion Score&#xff09;是一種常用的主觀評價指標&#xff0c;用于衡量音頻質量。然而&#xff0c;獲取主觀 MOS 評分通常需要大量的人力和時間。因此&#xff0c;無參 MOS 算法應運而生&#…

Flowable——配置使用Flowable-UI

文章目錄 前言 框架選型與版本 flowable-ui 搭建 依賴引入 springboot 主要版本 flowable 相關 log4j 日志配置項 配置文件 log4j配置文件 application.yml 增加啟動類并啟動程序 項目整體結構 前言 最近對工作流的flowable比較感興趣,匯總記錄一下相關的研究學習知識點。 框…

2025大學生必考互聯網行業證書排名?

在互聯網行業蓬勃發展的當下&#xff0c;大學生若想畢業后順利投身其中&#xff0c;提前考取相關高含金量證書不失為明智之舉。這些證書不僅能證明專業能力&#xff0c;還能在求職時為你增添競爭優勢。接下來&#xff0c;為大家詳細介紹 2025 年大學生必考的互聯網行業證書排名…