Go的原子性使用

字號+ 編輯: IT男在阿里 修訂: SyncLWT 來源: 利志分享 2023-09-11 我要說兩句(0)

以代碼的方式解釋Go語言原子性使用方法。

package main

import (  
    "fmt"  
    "runtime"  
    "sync/atomic"  
    "time"  
)

func main() {  
    // 定義一個整數  
    var ops uint64 = 0  

    // 使用50個協程給ops累加數值
    for i := 0; i < 50; i++ {
        go func() {
            // 這裡是循環多少次未知
            for {
                atomic.AddUint64(&ops, 1)
                // 這個函數用於時間片切換,可以理解爲高級版的time.Sleep(),避免前面的for循環將CPU時間片都卡在一個線程裡,使得其它線程沒有執行機會
                // runtime.Gosched()表示讓CPU把時間片讓給別人,下次某個時候繼續恢複執行該goroutine,自己一般是阻塞了,這是一個很高級的sleep,我們經常會遇到要sleep多久的問題,這裡不用考慮了,別人完成後,自然會通知你。
                runtime.Gosched()
            }
        }()
    }

    // 停一秒,上面50個線程有1秒的執行時間
    time.Sleep(time.Second)

    // 獲取結果
    opsFinal := atomic.LoadUint64(&ops)
    fmt.Println("ops:", opsFinal)

    //
    var tmpOps int64 = 0
    t1 := time.Now().UnixNano()
    //執行n個線程執行原子操作
    for tmpOps < 10000000 {
        go func() {
            atomic.AddInt64(&tmpOps, 1)
        }()
    }
    t2 := time.Now().UnixNano()
    t := t2 - t1
    fmt.Println(t)
    fmt.Println(tmpOps)

}
閲完此文,您的感想如何?
  • 有用

    0

  • 沒用

    0

  • 開心

    0

  • 憤怒

    0

  • 可憐

    0

1.如文章侵犯了您的版權,請發郵件通知本站,該文章將在24小時内刪除;
2.本站標注原創的文章,轉發時煩請注明來源;
3.交流群: 2702237 13835667

相關課文
  • GO語言GORM如何更新字段

  • gorm如何創建記錄與模型定義需要注意什麽

  • gorm一般查詢與高級查詢

  • GORM時間戳跟蹤及CURD(增刪改查)

我要說說
網上賓友點評