欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go?sync包中的互斥鎖Mutex和等待組WaitGroup使用詳解

 更新時間:2023年08月02日 11:55:57   作者:移動安全星球  
這篇文章主要為大家介紹了go?sync包中的互斥鎖Mutex和等待組WaitGroup使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

Go 語言的sync包

Go 語言的 sync 包提供了一些基本的同步原語,如互斥鎖(Mutex)和等待組(WaitGroup)。這些原語可以幫助你在多個 Go Routine 之間同步狀態(tài)。

Mutex

互斥鎖是一種同步工具,用于保證多個 Go Routine 在訪問共享資源時的互斥性。

創(chuàng)建 Mutex:

var m sync.Mutex

使用 Mutex:

m.Lock()
// 臨界區(qū),只有獲得鎖的 Go Routine 才能訪問
m.Unlock()

例如,假設(shè)我們有一個計數(shù)器## sync 包的使用

Go 語言的 sync 包提供了一些基本的同步原語,如互斥鎖(Mutex)和等待組(WaitGroup)。這些原語可以幫助你在多個 Go Routine 之間同步狀態(tài)。

Mutex

互斥鎖是一種同步工具,用于保證多個 Go Routine 在訪問共享資源時的互斥性。

創(chuàng)建 Mutex:

var m sync.Mutex

使用 Mutex:

m.Lock()
// 臨界區(qū),只有獲得鎖的 Go Routine 才能訪問
m.Unlock()

例如,假設(shè)我們有一個計數(shù)器,我們希望它能在多個 Go Routine 之間安全地使用:

package main
import (
    "fmt"
    "sync"
    "time"
)
type SafeCounter struct {
    v   map[string]int
    mux sync.Mutex
}
func (c *SafeCounter) Inc(key string) {
    c.mux.Lock()
    c.v[key]++
    c.mux.Unlock()
}
func (c *SafeCounter) Value(key string) int {
    c.mux.Lock()
    defer c.mux.Unlock()
    return c.v[key]
}
func main() {
    c := SafeCounter{v: make(map[string]int)}
    for i := 0; i < 1000; i++ {
        go c.Inc("somekey")
    }
    time.Sleep(time.Second)
    fmt.Println(c.Value("somekey"))
}

在這個例子中,SafeCounter 的每個方法在操作 v 之前都會鎖定 Mutex 來確保安全訪問。

WaitGroup

WaitGroup 是用于等待一組 Go Routines 完成的結(jié)構(gòu)。

使用 WaitGroup:

var wg sync.WaitGroup

每次一個 Go Routine 啟動時,我們調(diào)用 wg.Add(1)。每次一個 Go Routine 完成時,我們調(diào)用 wg.Done()。我們可以使用 wg.Wait() 來阻塞,直到所有的 Go Routines 完成。

例如,假設(shè)我們啟動了多個 Go Routine 來完成一些工作,我們希望等待它們?nèi)客瓿桑?/p>

package main
import (
    "fmt"
    "sync"
    "time"
)
func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("Worker %d starting\n", id)
    time.Sleep(time.Second)
    fmt.Printf("Worker %d done\n", id)
}
func main() {
    var wg sync.WaitGroup
    for i := 1; i <= 5; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }
    wg.Wait()
}

在這個例子中,我們使用 WaitGroup 來等待 5 個 worker Go Routines 完成。

總結(jié)

Go 語言的 sync 包提供了互斥鎖和等待組等同步原語,它們可以幫助我們在多個 Go Routine 之間同步狀態(tài)。雖然 Go 語言的并發(fā)模型主要是基于 Channels 的,但在某些情況下,使用 sync 包提供的同步原語可能會更加方便或有效。

以上就是go sync包中的互斥鎖Mutex和等待組WaitGroup使用詳解的詳細(xì)內(nèi)容,更多關(guān)于go sync包互斥鎖等待組的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 基于Go語言實現(xiàn)類似tree命令的小程序

    基于Go語言實現(xiàn)類似tree命令的小程序

    tree?命令是一個小型的跨平臺命令行程序,用于遞歸地以樹狀格式列出或顯示目錄的內(nèi)容。本文將通過Go語言實現(xiàn)類似tree命令的小程序,需要的可以參考一下
    2022-10-10
  • go語言同步教程之條件變量

    go語言同步教程之條件變量

    這篇文章主要給大家介紹了關(guān)于go語言同步教程之條件變量的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-07-07
  • GO語言實現(xiàn)批量壓縮圖片和水印

    GO語言實現(xiàn)批量壓縮圖片和水印

    這篇文章主要介紹了GO語言實現(xiàn)批量壓縮圖片和水印,主要用到了github.com/nfnt/resize這個第三方庫,僅僅支持JPG圖片格式,有相同需求的小伙伴參考下吧。
    2015-03-03
  • Go一站式配置管理工具Viper的使用教程

    Go一站式配置管理工具Viper的使用教程

    Viper是一個方便Go語言應(yīng)用程序處理配置信息的庫,它可以處理多種格式的配置,這篇文章主要為大家介紹了它的具體使用教程,需要的可以參考下
    2023-08-08
  • 一文詳解Golang中的基礎(chǔ)語法

    一文詳解Golang中的基礎(chǔ)語法

    這篇文章主要為大家詳細(xì)介紹了Golang中基礎(chǔ)語法的相關(guān)知識,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Golang有一定的幫助,感興趣的可以了解一下
    2023-03-03
  • Golang日志操作庫zap的使用詳解

    Golang日志操作庫zap的使用詳解

    zap?是?uber?開源的一個高性能,結(jié)構(gòu)化,分級記錄的日志記錄包,本文主要為大家詳細(xì)介紹了zap的具體使用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • Go打包附件內(nèi)容到執(zhí)行文件的方法

    Go打包附件內(nèi)容到執(zhí)行文件的方法

    處于種種原因, 我們不希望這部分額外的內(nèi)容以附件的形式出現(xiàn), 有沒有什么辦法能夠?qū)⒏郊?nèi)容直接打包進(jìn)可執(zhí)行文件中呢,下面小編給大家介紹下Go打包附件內(nèi)容到執(zhí)行文件的方法,感興趣的朋友一起看看吧
    2023-03-03
  • Golang中map的三種聲明定義方式實現(xiàn)

    Golang中map的三種聲明定義方式實現(xiàn)

    本文主要介紹了Golang中map的三種聲明定義方式實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • Golang Http 驗證碼示例實現(xiàn)

    Golang Http 驗證碼示例實現(xiàn)

    這篇文章主要介紹了Golang Http 驗證碼示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • go語言中線程池的實現(xiàn)

    go語言中線程池的實現(xiàn)

    Go語言中并沒有直接類似 Java 線程池的內(nèi)建概念,主要通過goroutine和channel來實現(xiàn)并發(fā)處理,本文主要介紹了go語言中線程池的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2025-04-04

最新評論