为了账号安全,请及时绑定邮箱和手机立即绑定

为什么通道会受到互斥锁的影响?

为什么通道会受到互斥锁的影响?

Go
千巷猫影 2022-08-15 10:17:54
我不知道为什么在使用互斥锁时工作。c <- i因为在函数的第一行有。rwMutex.Lock()second()如果在通道中不起作用,则无法理解以下输出值。输出值按 1 的顺序排列。mutex执行go second(...)执行rwMutex.Lock()所以不要运行,因为写入被锁定!c <- i但正在工作。num := <-cmain.govar (    dataSendChannel = make(chan int)    rwMutex         = new(sync.RWMutex))func main() {    go first(dataSendChannel)    time.Sleep(time.Second * 100)}func first(c chan<- int) {    for i := 1; i <= 10; i++ {        go second(dataSendChannel)        c <- i    }}func second(c <-chan int) {    rwMutex.Lock()    num := <-c    time.Sleep(time.Duration(10-num) * time.Second)    fmt.Println("[NUM] : ", num)    rwMutex.Unlock()}输出[NUM] :  1[NUM] :  2[NUM] :  3[NUM] :  4[NUM] :  5[NUM] :  6[NUM] :  7[NUM] :  8[NUM] :  9[NUM] :  10这是不使用 时的输出值。mutexmain.gofunc second(c <-chan int) {    num := <-c    time.Sleep(time.Duration(10-num) * time.Second)    fmt.Println("[NUM] : ", num)}输出[NUM] :  10[NUM] :  9[NUM] :  8[NUM] :  7[NUM] :  6[NUM] :  5[NUM] :  4[NUM] :  3[NUM] :  2[NUM] :  1在通道上接收到一个数据后,互斥锁是否有效?
查看完整描述

1 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

使用互斥锁锁定变量时,将阻止后续的 goroutine 锁定互斥体,因为它尚未解锁。num


因此,第二个goroutine实际上等到第一个完成睡眠(9秒),然后打印数字1。只有在那一刻,第二个 goroutine 可以锁定互斥体并写入变量 ,但第三个 goroutine 还不能访问,所以它再次等待,直到第二个 goroutine 打印数字,依此类推。num


没有互斥体,第一个goroutine的睡眠时间最长,它不会阻止其他人执行和写入,所以它打印了最新的,其他人可以先完成他们的工作,因为睡眠时间更短,完成得更快。num


如果删除睡眠状态,则两种情况下的工作方式相同。


package main


import (

    "fmt"

    "sync"

    "time"

)


var (

    dataSendChannel = make(chan int)

    rwMutex         = new(sync.RWMutex)

)


func main() {

    go first(dataSendChannel)

    time.Sleep(time.Second * 100)

}


func first(c chan<- int) {

    for i := 1; i <= 10; i++ {

        go second(dataSendChannel)

        c <- i

    }

}


func second(c <-chan int) {

    rwMutex.Lock()

    num := <-c

    fmt.Println("[NUM] : ", num)

    rwMutex.Unlock()

}


查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信