美文网首页
Concurrency

Concurrency

作者: SongLiang | 来源:发表于2018-06-12 01:09 被阅读0次

    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)
        }
    
    • Our goroutine, which is incrementing the data variables.
    • Our if statement, which checks whether the value of data is 0.
    • Our fmt.Printf statement, which retrieves the value of data for output.

    解决 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()
    

    相关文章

      网友评论

          本文标题:Concurrency

          本文链接:https://www.haomeiwen.com/subject/gcwkeftx.html