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(增刪改查)
我要說說
網上賓友點評
課文推薦