golang 併發中全局惟一操做

package main

// go 攜程共享 數據
// 加鎖解鎖操做
// 同步鎖
import (
	"sync"
	"fmt"
)
// 建立Once結構
var once = sync.Once{}

func computed(data *int, lock *sync.Mutex) {
	once.Do(Echo) // 全局惟一操做
	lock.Lock()   // 加鎖霸佔數據
	*data++
	fmt.Println(*data)
	lock.Unlock() // 解鎖讓出數據
}
func Echo() {
	fmt.Println("全局惟一操做")
}

func main() {
	var data int = 0
	lock := &sync.Mutex{}
	for i := 0; i < 10; i++ { // 啓動10個攜程
		go computed(&data, lock) // 併發中只執行一次 Echo 函數 once.Do(Echo)全局惟一操做
	}

	for {
		lock.Lock()
		c := data
		lock.Unlock()
		if c >= 10 {
			fmt.Println("val=", data, "exit")
			break
		}
	}
}
相關文章
相關標籤/搜索