這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。發表回複
通過原子計數可以在多線程情況下,對同一個數值進行加減操作,一般用於狀態同步。
先看代碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
|
package main
import "fmt" import "time" import "sync/atomic" import "runtime"
func main() {
// 定義一個整數 var ops uint64 = 0
// 使用50個線程給ops累加數值 for i := 0; i < 50; i++ { go func() { for { // 每次加1 atomic.AddUint64(&ops,1)
// 這個函數用於時間片切換 //可以理解為進階版的time.Sleep() //避免前面的for迴圈將CPU時間片都卡在一個線程裡,使得其它線程沒有執行機會 runtime.Gosched() } }() }
//停一秒,上面50個線程有1秒的執行時間 time.Sleep(time.Second)
// 擷取結果 opsFinal := atomic.LoadUint64(&ops) fmt.Println("ops:", opsFinal) } |
列印結果類似:
ops: 40200
如果不使用原子計數,直接使用ops =ops+1會導致多線程時計數不準確。
開啟Go源碼中的atomic包,可以看到相關演算法都是用組合語言寫的。所以原子計數執行效率非常高。
本條目發佈於2015年10月6日。屬於go語言分類。作者是baiyuxiong。
文章導航
← 早期文章較新文章→
搜尋本站文章
日誌分類
- go語言 (76)
- swift (10)
- webos開發 (8)
- 亂七八糟 (59)
- 程式設計 (170)
- 網站製作 (72)
最新文章
- 記一次詭異的win10 “丟失”檔案事件
- 企業 查不到該手機號的所屬企業 的解決辦法
- gradle學習總結
- 關於swift中的強引用 弱引用 無主引用
- 串連aws ec2提示Operation timed out的解決辦法
近期評論
- 捕魚器發表在《仿twitter的開源微型部落格系統》
- 電子捕魚器發表在《仿twitter的開源微型部落格系統》
- 捕魚機發表在《仿twitter的開源微型部落格系統》
- 電魚機發表在《仿twitter的開源微型部落格系統》
- 捕魚器發表在《仿twitter的開源微型部落格系統》
日誌索引
日誌索引
連結資料表
- IMCN-我是菜鳥
- 中式裝修
- 中式裝修
- 代碼瘋子
- 寺院裝修
- 果殼部落格
Meta
- 登入
- 文章RSS
- 評論RSS
- WordPress.org