能sync.WaitGroup后可重复使用Wait()被称为?
func worker(who string, in <-chan int, wg *sync.WaitGroup) {
for i := range in {
fmt.Println(who, i)
wg.Done()
}
}
func main() {
var wg sync.WaitGroup
AIn := make(chan int, 1)
BIn := make(chan int, 1)
go worker("a:", AIn, &wg)
go worker("b:", BIn, &wg)
for i := 0; i < 4; i++ {
wg.Add(2)
AIn <- i
BIn <- i
wg.Wait()
fmt.Println("main:", i)
}
}
Run Code Online (Sandbox Code Playgroud)
这个play.golang.org/p/QLsvA-b4Ae按预期运行,但它是否保证安全?文档没有这么说,但也许我只是偏执狂.
Gus*_*yer 19
是的,这是安全的.事实上,它甚至比那更安全.您可以同时Wait从多个goroutine,并根据您的用例进行交换Add和Done调用.只要在此Add之前发生Wait,你应该是安全的.
出于好奇,现在WaitGroup使用互斥锁,两个int32s计数器和一个信号量来实现:
type WaitGroup struct {
m Mutex
counter int32
waiters int32
sema *uint32
}
Run Code Online (Sandbox Code Playgroud)
这也是一个有趣的测试:
var wg1, wg2 sync.WaitGroup
wg1.Add(1)
wg1.Done()
wg1.Wait()
fmt.Println(wg1 == wg2) // Prints true
Run Code Online (Sandbox Code Playgroud)
最后,如果您确实发现了这种用途的任何问题,请报告,因为它将是一个错误.
| 归档时间: |
|
| 查看次数: |
3042 次 |
| 最近记录: |