Go語言同步原語與數據競爭:WaitGroup

在Go語言并發編程中,我們經常需要等待多個 goroutine 執行完畢后再繼續下一步操作。Go 提供的?sync.WaitGroup?就是專為這種**“等待一組任務完成”**而設計的同步原語。


一、基本原理

sync.WaitGroup?提供三個主要方法:

方法說明
Add(n int)設置等待的 goroutine 數量(加計數)
Done()每個 goroutine 完成時調用(減計數)
Wait()阻塞主 goroutine,直到計數歸零

它內部使用計數器+條件變量,當所有 goroutine 都調用?Done()?后,Wait()?才會解除阻塞。


二、典型用法

示例:等待 10 個 goroutine 執行完畢
package?mainimport?("fmt""sync"
)func?worker(id?int,?wg?*sync.WaitGroup)?{defer?wg.Done()?//?每個?goroutine?完成時調用fmt.Printf("Worker?%d?is?working...\n",?id)//?模擬工作
}func?main()?{var?wg?sync.WaitGroupfor?i?:=?1;?i?<=?10;?i++?{wg.Add(1)?//?每啟動一個?goroutine,加1go?worker(i,?&wg)}wg.Wait()?//?阻塞直到所有?goroutine?完成fmt.Println("All?workers?done.")
}

輸出示意:

Worker?1?is?working...
Worker?2?is?working...
...
All?workers?done.

三、常見錯誤及注意事項

1.?Add()?必須在 goroutine 啟動前調用

錯誤示例:

go?func()?{wg.Add(1)?//?此時?goroutine?可能已開始執行,競態風險...
}()

正確做法:

wg.Add(1)
go?func()?{...wg.Done()
}()
2. 不可重復使用已完成的 WaitGroup(沒有“重置”功能)

WaitGroup 設計為一次性同步器,不建議重復使用,若確需控制并發次數,可用?sync.Pool?或?semaphore?替代。


四、結合匿名函數使用

for?i?:=?0;?i?<?5;?i++?{wg.Add(1)go?func(i?int)?{defer?wg.Done()fmt.Println("i:",?i)}(i)
}
wg.Wait()

?? 注意:傳參?i?必須顯式傳入閉包,避免捕獲變量陷阱。


五、使用場景

  • ? 等待一組任務執行完成(如:并發下載、批量計算)
  • ? 控制主函數在 goroutine 完成后再退出
  • ? 可搭配 Channel 和 Context 使用,實現更復雜的并發控制模型

六、小結

  • ??sync.WaitGroup?是 Go 并發編程中最常用的同步工具之一。
  • ? 使用?Add/Done/Wait?實現多協程間的同步等待。
  • ? 使用時避免競態和變量捕獲問題。

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

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

相關文章

Java單體架構 vs 分布式架構

Java單體架構 vs 分布式架構 在電商系統開發中&#xff0c;當用戶量從幾百激增到百萬級&#xff0c;你的架構是否還能從容應對&#xff1f;一次代碼更新是否意味著整個系統停機&#xff1f;今天我們就來拆解Java架構設計的核心命題&#xff1a;單體還是分布式&#xff1f; 一、…

day40- 硬件學習之 51單片機II (中斷處理)

一、獨立按鍵的使用 main.c key.c key.h 二、中斷處理 2.1 定義 中斷系統是為使CPU具有對外界緊急事件的實時處理能力而設置的。 當CPU正在處理某件事的時候外界發生了緊急事件請求&#xff0c;要求CPU暫停當前的工作&#xff0c;轉而去處理這個緊急事件&#xff0c;處理完以…

機器學習:開啟智能時代的大門

一、引言 機器學習&#xff08;Machine Learning&#xff09;正成為人工智能的核心技術。從 Netflix 推薦電影&#xff0c;到銀行識別欺詐交易&#xff0c;機器學習正在逐漸改變世界。本篇文章將從理論到實操全面介紹機器學習的基礎概念&#xff0c;并附有代碼和案例。 二、什…

幾個重要的行列式 線性代數

目錄 1.主&#xff08;副&#xff09;對角線行列式 2 拉普拉斯展開式 3 范德蒙德行列式 對于行列式的計算來說&#xff0c;一般給出的行列式我們都要對其進行化簡&#xff0c;但是化簡到什么程度就可以了呢&#xff1f; 這就是本篇的用處&#xff0c;一般給出的行列式化簡的…

答辯講解387基于Spring Boot的心理健康管理系統

摘 要 視頻地址 答辯講解387基于Spring Boot的心理健康管理系統_嗶哩嗶哩_bilibili 自改革開放政策施行以來&#xff0c;我國經濟持續保持快速增長態勢&#xff0c;國民生活水平得到了明顯提升&#xff0c;然而近些年來&#xff0c;經濟增速出現放緩&#xff0c;再加上疫情等…

使用WinUSB讀寫USB設備

參考&#xff1a;使用WinUSB讀寫USB設備 - USB中文網

DECOUPLING REPRESENTATION AND CLASSIFIER FOR LONG-TAILED RECOGNITION

摘要 在本文中&#xff0c;我們將學習過程解耦為表征學習和分類&#xff0c;系統地探究不同的平衡策略如何對長尾識別產生影響。研究結果令人驚訝&#xff1a;&#xff08;1&#xff09;數據不平衡在學習高質量表征時可能并非問題&#xff1b;&#xff08;2&#xff09;通過最…

如何使用joomla5緩存來加速網頁加載速度

Joomla 有多種緩存“內容”的方式。我們將以兩個角色來介紹和使用緩存&#xff0c;在這篇將以普通管理員的視角來概述——緩存什么、在哪里緩存以及何時緩存。 什么是Joomla 緩存cacha 作為管理員&#xff0c;Joomla 為您提供了緩存網站內容的能力。您可以選擇緩存整個網頁或…

《我們的十年》電影聯合品宣品牌白碧美:自然與科技共融

破界新生&#xff0c;定義東方美膚高度 湖南白碧美生物科技有限公司&#xff0c;扎根中國創新活力之都——星城長沙&#xff0c;是以“科技賦能美膚”為核心的高端輕奢護膚品牌。秉承“自然與科技共融”的品牌哲學&#xff0c;白碧美將千年東方草本植萃智慧與現代尖端生物科技…

B樹與B+樹:數據庫索引背后的秘密

B-tree&#xff08;B樹&#xff09;和Btree&#xff08;B樹&#xff09;是兩種高效的多叉樹數據結構&#xff0c;專為磁盤存儲系統優化設計&#xff0c;廣泛應用于數據庫和文件系統的索引。以下是兩者的核心特點及區別&#xff1a; ?? 一、B-tree&#xff08;B樹&#xff09;…

歐洲宇航局如何為航天員提供虛擬現實訓練內容

通過身臨其境的模擬&#xff0c;宇航員可以完善他們在太空行走中執行的每一個動作&#xff0c;以確保更好地準備前往國際空間站、月球和其他地方執行任務。 VR/XR技術在宇航員訓練中的優勢&#xff1a; 提高安全性:復雜或危險程序的無風險實踐 成本和資源節約:減少對實體模型、…

打卡Day53

知識點&#xff1a; 1.對抗生成網絡的思想&#xff1a;關注損失從何而來 2.生成器、判別器 3.nn.sequential容器&#xff1a;適合于按順序運算的情況&#xff0c;簡化前向傳播寫法 4.leakyReLU介紹&#xff1a;避免relu的神經元失活現象 ps&#xff1a;如果你學有余力&#xf…

【Three.js】機器人管線包模擬

機器人管線包模擬 背景技術選型效果視頻效果截圖 最近在工業數字化項目中嘗試用Three.js實現了一個機器人管線包的3D可視化模擬系統&#xff0c;記錄一下開發過程和技術要點&#xff0c;希望能給同樣在探索Web3D技術的同學一些靈感。 背景 管線包&#xff08;Dress Pack&…

微軟將開始使用 Copilot Vision 監控 Windows 10 和 11 用戶的螢幕

這對於提供幫助是必要的&#xff0c;美國用戶已經可以欣賞這項創新。 微軟為其AI助理Copilot添加了新的Vision功能&#xff0c;使其能夠即時分析用戶螢幕上發生的事情並幫助解決當前的問題。 根據該公司介紹&#xff0c;Copilot Vision 能夠捕捉使用者所見內容&#xff0c;並可…

多模態大語言模型arxiv論文略讀(123)

Enhancing Advanced Visual Reasoning Ability of Large Language Models ?? 論文標題&#xff1a;Enhancing Advanced Visual Reasoning Ability of Large Language Models ?? 論文作者&#xff1a;Zhiyuan Li, Dongnan Liu, Chaoyi Zhang, Heng Wang, Tengfei Xue, Weid…

【linux】Linux vs Android

文章目錄 1、聯系2、區別3、核心差異4、應用場景對比5、未來發展趨勢6、參考附錄——GNU 都說Android就是個裝了UI的Linux&#xff0c;可到底和Linux有什么關系呢&#xff1f; 1、聯系 內核基礎 共享Linux內核&#xff1a;安卓基于Linux內核構建&#xff0c;繼承了Linux的進程…

臺積電(TSMC)工藝庫命名規則

以標準單元庫tcb_n12ffcll_bwp_6t_20_p96_cpd_lvt_tt0p8v25c_hm_lvf_p_ccs舉例說明臺積電工藝庫命名規則。 文件名分段解析 字段含義補充說明tcbTSMC標準單元庫(TCBN = TSMC Cell Library, Base Node)通常用于標識基礎標準單元庫,區別于IO庫(tciobn)或模擬庫(tcap)。n1…

飛算 JavaAI 模塊化生成:重構效率與體驗的雙重升級

在 Java 老項目重構場景中&#xff0c;代碼生成的顆粒度與可控性直接影響開發效率。飛算 JavaAI 創新推出的模塊化智能生成機制&#xff0c;支持按接口、按模塊粒度觸發源碼生成&#xff0c;通過任務拆解與漸進式交付模式&#xff0c;為開發者提供更靈活的重構節奏控制&#xf…

硬件-DAY02(按鍵、中斷、定時器、蜂鳴器)

補充&#xff1a;1.變量前加code&#xff0c;從RAM區變成ROM區 2.三極管的原理就是PN結 3.裸機程序是單線程的&#xff0c;display時不能delay 一、獨立按鍵 1.高電平沒按&#xff0c;低電平按了 按鍵原理&#xff1a;輪詢方式&#xff08;poll&#xff09;-->以消耗大量CP…

前端頁面html開發案例入門實踐、超鏈接標簽、圖片標簽、常用站點

前端頁面html開發案例入門實踐 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>html案例</title> </head> <body><h1>web前端開發</h1><h2>HTML</h2><…