Golang基礎知識—cond

cond?通常指?sync.Cond,它是標準庫?sync?包中用于實現?條件變量?的同步原語。條件變量在多 goroutine 協作場景中非常有用,尤其在需要根據特定條件協調多個 goroutine 的執行順序時。


sync.Cond?的核心作用

條件變量用于?等待某個條件滿足?或?通知其他等待者條件已滿足。常用于以下場景:

  • 一個或多個 goroutine 需要等待某個條件成立才能繼續執行。

  • 某個 goroutine 負責修改條件,并通知其他等待的 goroutine。


sync.Cond?的組成

type Cond struct {L Locker // 關聯的鎖(通常是 sync.Mutex 或 sync.RWMutex)
}

主要方法:

  1. Wait()

    • 調用前必須持有鎖(c.L.Lock())。

    • 釋放鎖并掛起當前 goroutine,等待被喚醒。

    • 被喚醒后重新獲取鎖,繼續執行。

  2. Signal()

    • 喚醒一個等待的 goroutine(隨機選擇一個)。

  3. Broadcast()

    • 喚醒所有等待的 goroutine。


基本使用模式

var (mu    sync.Mutexcond  = sync.NewCond(&mu)ready bool
)// 等待條件滿足的 goroutine
func waiter() {mu.Lock()defer mu.Unlock()for !ready { // 必須用循環檢查條件(防止虛假喚醒)cond.Wait()}// 執行條件滿足后的操作
}// 修改條件并通知的 goroutine
func setter() {mu.Lock()ready = truemu.Unlock()cond.Signal() // 或 cond.Broadcast()
}
 

經典示例:生產者-消費者

package mainimport ("fmt""sync""time"
)func main() {var mu sync.Mutexcond := sync.NewCond(&mu)queue := make([]int, 0)// 消費者go func() {for {mu.Lock()for len(queue) == 0 {cond.Wait() // 等待隊列非空}item := queue[0]queue = queue[1:]fmt.Println("Consumed:", item)mu.Unlock()}}()// 生產者for i := 1; i <= 5; i++ {time.Sleep(1 * time.Second)mu.Lock()queue = append(queue, i)fmt.Println("Produced:", i)cond.Signal() // 通知消費者mu.Unlock()}
}

關鍵注意事項

  1. 必須用循環檢查條件
    Wait()?返回后條件可能仍未滿足(如虛假喚醒),需循環檢查:

    for conditionNotMet {cond.Wait()
    }
  2. 調用?Wait()?前必須持有鎖
    否則會導致競態條件。

  3. Signal?vs?Broadcast

    • Signal:喚醒一個等待者(適用于單消費者)。

    • Broadcast:喚醒所有等待者(適用于多消費者或條件變化影響所有等待者)。


何時使用?sync.Cond

  • 需要?基于復雜條件協調多個 goroutine

  • 需要?同時喚醒多個等待者(如資源釋放時喚醒所有等待的 goroutine)。

對于簡單場景,優先考慮使用?channel(Go 的推薦并發模式):

// 用 channel 實現類似功能
ch := make(chan int)// 生產者
go func() {ch <- 1
}()// 消費者
go func() {item := <-ch
}()

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

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

相關文章

MySQL 8.0 OCP 1Z0-908 題目解析(1)

題目001 Choose two. User fwuserlocalhost is registered with the SQL Enterprise Firewall and has been granted privileges for the sakila database. Examine these commands that you executed and the results: mysql> SELECT MODE FROM INFORMATION_SCHEMA.SQL…

【Tools】git使用詳解以及遇到問題匯總

這里寫目錄標題 安裝git安裝 TortoiseGitgit github gitlab, Gitee 區別visual studio中使用gitgit使用步驟git命令git刪除某些歷史提交記錄git找回丟失代碼git上傳文本和二進制和gitignore刪除文件刪不掉的問題 安裝git https://blog.csdn.net/mukes/article/details/1156938…

畫立方體軟件開發筆記 js-pytorch xlsx 導出 excel pnpm安裝

js-pytorch npm install -g pnpm pnpm add js-pytorch 放著&#xff0c;等我把模型訓練好了再用這個對接 xlsx pnpm install xlsx ai寫代碼&#xff0c;一遍就通了 import * as XLSX from "xlsx"; import { linelist } from ./2dviewport.js; function export…

Kotlin并發請求的一些知識記錄

private suspend fun fetchDataConcurrently(list: MutableList<MyType>,onRequestResult: (Int, List<MyType>?) -> Unit //高階函數回調) {val deferredList mutableListOf<Deferred<MyType?>>()// 設定任務超時時間為12秒&#xff0c;并使用 …

配置VScodePython環境Python was not found;

Python was not found; run without arguments to install from the Microsoft Store, or disable this shortcut from Settings > Manage App Execution Aliases. 候試試重啟電腦。 在卸載重裝python后會出現難以解決的局面&#xff0c;系統變量&#xff0c;命令行&#…

OracleLinux7.9-ssh問題

有套rac環境&#xff0c;db1主機無法ssh db1和db1-priv&#xff0c;可以ssh登錄 db2和db2-priv [rootdb1 ~]# ssh db1 ^C [rootdb1 ~]# ssh db2 Last login: Wed May 14 18:25:19 2025 from db2 [rootdb2 ~]# ssh db2 Last login: Wed May 14 18:25:35 2025 from db1 [rootdb2…

如何創建maven項目

1.IDEA 中創建 Maven 項目 步驟一&#xff1a;點擊 File -> New -> Project&#xff0c;在彈出的窗口左側選擇 Maven&#xff0c;點擊 Next&#xff1a; 步驟二&#xff1a;填寫項目的 GroupId、ArtifactId、Version 等信息&#xff08;這些對應 pom.xml 中的關鍵配置&am…

Python爬蟲實戰:研究ajax異步渲染加密

一、引言 在當今數字化時代,數據已成為推動各行業發展的核心驅動力。網絡爬蟲作為一種高效的數據采集工具,能夠從互聯網上自動獲取大量有價值的信息。然而,隨著 Web 技術的不斷發展,越來越多的網站采用了 AJAX(Asynchronous JavaScript and XML)異步渲染技術來提升用戶體…

滬深股指期貨指數怎么參考交易?

滬深股指期貨指數&#xff0c;其實它就是咱們炒股時的一個“風向標”和“工具箱”。今天咱們就來聊聊怎么參考這個指數來交易&#xff0c;讓你也能輕松上手&#xff01; 一、滬深股指期貨指數是啥&#xff1f; 滬深股指期貨指數&#xff0c;簡單來說&#xff0c;就是基于滬深…

演員評論家算法

一、演員評論家算法核心思想和原理 演員(actor)代表策略&#xff0c;評論家代表價值函數。演員評論家算法是基于價值和策略的綜合性方法。具體來說該算法使用了策略梯度和時序差分方法&#xff0c;是二者的一種有機結合。 1. 主要思想 策略梯度算法以軌跡為單位更新&#xf…

PyCharm 快捷鍵指南

PyCharm 快捷鍵指南 常用編輯快捷鍵 代碼完成&#xff1a;Ctrl Space 提供基本的代碼完成選項&#xff08;類、方法、屬性&#xff09;導入類&#xff1a;Ctrl Alt Space 快速導入所需類語句完成&#xff1a;Ctrl Shift Enter 自動結束代碼&#xff08;如添加分號&#…

計算圖存儲采用矩陣嗎,和張量關系

計算圖存儲采用矩陣嗎,和張量關系 計算圖的存儲方式與張量的關系 一、計算圖的存儲方式 計算圖(Computational Graph)是一種用于描述數學運算的有向無環圖(DAG),其節點代表運算(如加減乘除、矩陣乘法、激活函數等),邊代表運算的輸入和輸出(通常是張量)。計算圖的…

RDD中分區、分區器及自定義分區器的學習

深入理解 Spark 中 RDD 分區與分區器&#xff1a;原理、應用及自定義實現 在大數據處理領域&#xff0c;Apache Spark 憑借其高效的分布式計算能力成為了眾多開發者的首選框架。在 Spark 中&#xff0c;彈性分布式數據集&#xff08;Resilient Distributed Dataset&#xff0c…

OpenCV CUDA 模塊中用于在 GPU 上計算矩陣中每個元素的絕對值或復數的模函數abs()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 void cv::cuda::abs(InputArray src, OutputArray dst, Stream &stream Stream::Null()) 是 OpenCV 的 CUDA 模塊中的一個函數&#xff0c;…

FramePack - 開源 AI 視頻生成工具

&#x1f3ac; 項目簡介 由開發者 lllyasviel 創建的一個輕量級動畫幀處理工具庫&#xff0c;專門用于游戲開發、動畫制作和視頻處理中的幀序列打包與管理。該項目采用高效的算法實現&#xff0c;能夠顯著提升動畫資源的處理效率。 此 AI 視頻生成項目&#xff0c;旨在通過低顯…

商業架構 2.0 時代:ZKmall開源商城前瞻性設計如何讓 B2B2C 平臺領先同行 10 年?

在數字化轉型加速的今天&#xff0c;傳統 B2B2C 平臺面臨用戶體驗割裂、數據孤島嚴重、業務擴展困難等挑戰。ZKmall 開源商城通過 “業務中臺 數據中臺 技術中臺”的三位一體架構設計&#xff0c;結合“插件化擴展 分布式服務 智能決策”*三大核心能力&#xff0c;構建起具…

Java中Money類的使用及與BigDecimal的對比

精心整理了最新的面試資料和簡歷模板&#xff0c;有需要的可以自行獲取 點擊前往百度網盤獲取 點擊前往夸克網盤獲取 一、為什么需要Money類&#xff1f; 在金融和商業計算中&#xff0c;精確的貨幣處理是至關重要的。雖然Java提供了BigDecimal類來處理高精度計算&#xff0c…

判斷數據的所有屬性是否都是基本類型

方法解釋 OnlyPrimitiveTypes 方法: 參數: 接收一個對象 obj 進行檢查。返回值: 返回布爾值&#xff0c;表示對象及其所有屬性是否僅包含基本類型。邏輯: 首先檢查 obj 是否為 null&#xff0c;如果是&#xff0c;則返回 true。然后檢查 obj 的類型是否為基本類型&#xff0c;如…

【Linux】Linux安裝并配置mysql

目錄 1.刪除原有mysql 2.添加 MySQL Yum Repository 3.安裝 MySQL 3.1.報錯 4.啟動 MySQL 服務 5.設置mysql 5.1.密碼驗證組件 5.2.密碼策略 5.3.移除匿名用戶 5.4.是否禁用root遠程訪問 5.5.是否刪除test 5.6.是否重新加載權限 5.7.設置遠程權限 5.7.1.登錄mysql…

springboot AOP 接口限流(基于IP的接口限流和黑白名單)

使用 Spring Boot 自定義注解和AOP實現基于IP的接口限流和黑白名單 在我們日常開發的項目中為了保證系統的穩定性&#xff0c;很多時候我們需要對系統做限流處理&#xff0c;它可以有效防止惡意請求對系統造成過載。常見的限流方案主要有&#xff1a; 網關限流&#xff1a; NG…