1. 程式人生 > 實用技巧 >Go之併發

Go之併發


package main
import "fmt"
import "sync"

var wg sync.WaitGroup

// 互斥鎖
var lock sync.Mutex
func main(){ // 開啟一個主goroutine來執行main函式
	// Go語言併發通過goroutine實現
	// goroutine類似於執行緒,屬於使用者態的執行緒
	// 我們可以根據需要建立成千上萬個goroutine併發工作
	// goroutine是Go語言的執行時排程完成,而執行緒是由作業系統排程完成
	// Go語言還提供channel在多個goroutine間通訊
	// goroutine 和 channel是Go語言秉承的CSP併發模式的重要實現基礎
	count := 0
	for i := 0; i < 1000; i++ {
		wg.Add(1) // 計數牌+1
		go hello(i, &count) // 開啟一個goroutine來執行hello這個函式
	}
	
	wg.Wait() // 阻塞,等所有小兵都幹完活才收兵
	fmt.Println("count", count) // 100000
}

func hello(num int, count *int){
	for i := 0; i < 100; i++ {
		// 加鎖
		lock.Lock()
		*count++

		// 釋放鎖
		lock.Unlock()
		fmt.Println("hello", num, i)
	}
	wg.Done() // 通知wg把計數牌-1
	
}