免费观看又色又爽又黄的小说免费_美女福利视频国产片_亚洲欧美精品_美国一级大黄大色毛片

Go并發編程之Mutex是什么-創新互聯

這篇文章給大家分享的是有關Go 并發編程之 Mutex是什么的內容。小編覺得挺實用的,因此分享給大家做個參考。一起跟隨小編過來看看吧。

成都創新互聯憑借在網站建設、網站推廣領域領先的技術能力和多年的行業經驗,為客戶提供超值的營銷型網站建設服務,我們始終認為:好的營銷型網站就是好的業務員。我們已成功為企業單位、個人等客戶提供了成都網站制作、成都網站設計服務,以良好的商業信譽,完善的服務及深厚的技術力量處于同行領先地位。

我們比較常見的大型項目的設計中都會出現并發訪問問題,并發就是為了解決數據的準確性,保證同一個臨界區的數據只能被一個線程進行操作,日常中使用到的并發場景也是很多的:

  • 計數器:計數器結果不準確;
  • 秒殺系統:由于同一時間訪問量比較大,導致的超賣;
  • 用戶賬戶異常:同一時間支付導致的賬戶透支;
  • buffer 數據異常:更新 buffer 導致的數據混亂。

上面都是并發帶來的數據準確性的問題,決絕方案就是使用互斥鎖,也就是今天并發編程中的所要描述的 Mutex 并發原語。

實現機制

互斥鎖 Mutex 就是為了避免并發競爭建立的并發控制機制,其中有個“臨界區”的概念。

在并發編程過程中,如果程序中一部分資源或者變量會被并發訪問或者修改,為了避免并發訪問導致數據的不準確,這部分程序需要率先被保護起來,之后操作,操作結束后去除保護,這部分被保護的程序就叫做臨界區

使用互斥鎖,限定臨界區只能同時由一個線程持有,若是臨界區此時被一個線程持有,那么其他線程想進入到這個臨界區的時候,就會失敗或者等待釋放鎖,持有此臨界區的線程退出,其他線程才有機會獲得這個臨界區。

Go 并發編程之 Mutex是什么

go mutex 臨界區示意圖

Mutex 是 Go 語言中使用最廣泛的同步原語,也稱為并發原語,解決的是并發讀寫共享資源,避免出現數據競爭 data race 問題

基本使用

互斥鎖 Mutex 提供了兩個方法 Lock 和 Unlock:進入到臨界區使用 Lock 方法加鎖,退出臨界區使用 Unlock 方法釋放鎖。

type Locker interface {
    Lock()
    Unlock()}func(m *Mutex)Lock()func(m *Mutex)Unlock()

當一個 goroutine 調用 Lock 方法獲取到鎖后,其他 goroutine 會阻塞在 Lock 的調用上,直到當前獲取到鎖的 goroutine 釋放鎖。

接下來是一個計數器的例子,是由 100 個 goroutine 對計數器進行累加操作,最后輸出結果:

package mainimport (
    "fmt"
    "sync")func main() {
    var mu sync.Mutex
    countNum := 0

    // 確認輔助變量是否都執行完成
    var wg sync.WaitGroup    // wg 添加數目要和 創建的協程數量保持一致
    wg.Add(100)
    for i := 0; i < 100; i++ {
        go func() {
            defer wg.Done()
            for j := 0; j < 1000; j++ {
                mu.Lock()
                countNum++
                mu.Unlock()
            }
        }()
    }
    wg.Wait()
    fmt.Printf("countNum: %d", countNum)}

實際使用

很多時候 Mutex 并不是單獨使用的,而是嵌套在 Struct 中使用,作為結構體的一部分,如果嵌入的 struct 有多個字段,我們一般會把 Mutex 放在要控制的字段上面,然后使用空格把字段分隔開來。

甚至可以把獲取鎖、釋放鎖、計數加一的邏輯封裝成一個方法。

package mainimport (
    "fmt"
    "sync")// 線程安全的計數器type Counter struct {
    CounterType int
    Name        string

    mu    sync.Mutex
    count uint64}// 加一方法func (c *Counter) Incr() {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.count++}// 取數值方法 線程也需要受保護func (c *Counter) Count() uint64 {
    c.mu.Lock()
    defer c.mu.Unlock()
    return c.count}func main() {
    // 定義一個計數器
    var counter Counter    var wg sync.WaitGroup
    wg.Add(100)

    for i := 0; i < 100; i++ {
        go func() {
            defer wg.Done()
            for j := 0; j < 1000; j++ {
                counter.Incr()
            }
        }()
    }
    wg.Wait()

    fmt.Printf("%d\n", counter.Count())}

感謝各位的閱讀!關于Go 并發編程之 Mutex是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

名稱欄目:Go并發編程之Mutex是什么-創新互聯
本文鏈接:http://m.newbst.com/article16/djhhgg.html

成都網站建設公司_創新互聯,為您提供外貿建站網站建設網站內鏈網頁設計公司定制網站Google

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網站建設公司