Concurrency

2018-06-12  本文已影响0人  SongLiang

critical section

var data int
go func() { data++}() ifdata==0{
fmt.Println("the value is 0.") }else{
        fmt.Printf("the value is %v.\n", data)
    }

解决 critical section 的蠢办法

对的,就是加锁

var memoryAccess sync.Mutex var value int
go func() {
        memoryAccess.Lock()
        value++
        memoryAccess.Unlock()
}()
memoryAccess.Lock() 
if value==0 {
        fmt.Printf("the value is %v.\n", value)
} else {
        fmt.Printf("the value is %v.\n", value)
}
memoryAccess.Unlock()

这里只解决了 data race,但是没有实际的去解决 race condition。
上面的代码中,到底是 go func 先执行还是 if 判断语句先执行,是没有明确的。

Deadlock

type value struct {
    mu sync.Mutex
    value int
}
var wg sync.WaitGroup
printSum := func(v1, v2 *value) {
        defer wg.Done() v1.mu.Lock()
        defer v1.mu.Unlock()
        time.Sleep(2*time.Second) v2.mu.Lock()
        defer v2.mu.Unlock()
        fmt.Printf("sum=%v\n", v1.value + v2.value)
}
var a, b value wg.Add(2)
go printSum(&a, &b) go printSum(&b, &a) wg.Wait()
上一篇下一篇

猜你喜欢

热点阅读