1 回答

TA貢獻1798條經驗 獲得超7個贊
一個很好的使用方式WaitGroup是Add()在發送到頻道之前先調用,或者使用go關鍵字,Done()在從頻道接收后再調用。這樣Add(),無論是否在通道塊上發送,都可以確保始終按時調用。
我已經更改了您的示例代碼來做到這一點:
package main
import (
"fmt"
"sync"
)
type safeOperation struct {
i int
sync.Mutex
}
var wg sync.WaitGroup
func main() {
so := new(safeOperation)
ch := make(chan int)
for i := 0; i < 5; i++ {
wg.Add(1)
go so.Increment(ch)
wg.Add(1)
go so.Decrement(ch)
}
go func() {
for c := range ch {
fmt.Println("Receiving Channel Value: ", c)
wg.Done()
}
}()
wg.Wait()
//<-done
fmt.Println("Value: ", so.GetValue())
fmt.Println("Main method finished")
}
func (so *safeOperation) Increment(ch chan int) {
so.i++
ch <- so.i
}
func (so *safeOperation) Decrement(ch chan int) {
so.i--
ch <- so.i
}
func (so *safeOperation) GetValue() int {
so.Lock()
v := so.i
so.Unlock()
return v
}
當然,您還希望safeOperation.i使用互斥鎖進行保護(否則其值將是不可預測的),但這就是獲得所需輸出所必需的全部操作。
- 1 回答
- 0 關注
- 234 瀏覽
添加回答
舉報