Concurrency

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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 12,196评论 0 10
  • 如何织好互联网这张大网,是一种智慧更是一项高超的技艺。密中有疏,疏而不漏,则天下兴焉;漏洞百出,残破不堪,则天下惶惶!
    芙溪生阅读 1,328评论 0 0
  • 今天继续学习了诸葛亮安居平五路的故事,通过具体分析这五路兵马,了解诸葛亮是如何透过现象抓本质,最后一一退敌的。...
    之乎者也06阅读 8,027评论 0 0
  • 碧波上面荡轻舟,岸边飘有垂杨柳;鲜花娇羞吐蜜意,绝世风景眼低收。 底收。
    昨日的星阅读 1,621评论 0 0
  • 在梦里 我的父亲他 眼神清亮 身材威武 我在他的肩头 看到远方 从不惧怕摔倒 因为脚踝被他紧握 在梦里 我的父亲他...
    俺就是那只猫阅读 1,202评论 0 3

友情链接更多精彩内容