2 回答
TA贡献1853条经验 获得超6个赞
您将使用实际的 sync.Mutex:
var mutex sync.Mutex
func next(p *int) int {
mutex.Lock()
defer mutex.Unlock()
x := *p
*p++
return x
}
尽管您可能还会将next功能、状态和 sync.Mutex 组合到一个结构中。
虽然在这种情况下没有理由这样做,因为 Mutex 更适合围绕单个资源进行互斥,您可以使用 goroutines 和通道来实现相同的效果
http://play.golang.org/p/RR4TQXf2ct
x := 0
var wg sync.WaitGroup
send := make(chan *int)
recv := make(chan int)
go func() {
for i := range send {
x := *i
*i++
recv <- x
}
}()
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
send <- &x
fmt.Println(<-recv)
}()
}
wg.Wait()
fmt.Println(x)
TA贡献1799条经验 获得超8个赞
正如@favoretti 提到的,同步/原子是一种方法。
但是,您必须使用 int32 或 int64 而不是 int (因为 int 在不同平台上的大小可能不同)。
这是Playground上的一个例子
package main
import (
"fmt"
"sync/atomic"
)
func main() {
done := make(chan int)
x := int64(0)
for i := 0; i < 10; i++ {
go func() {
y := next(&x)
fmt.Println(y)
done <- 0
}()
}
for i := 0; i < 10; i++ {
<-done
}
fmt.Println(x)
}
func next(p *int64) int64 {
return atomic.AddInt64(p, 1) - 1
}
- 2 回答
- 0 关注
- 183 浏览
添加回答
举报