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

我不知道为什么在使用互斥锁时工作。c <- i

因为在函数的第一行有。rwMutex.Lock()second()

如果在通道中不起作用,则无法理解以下输出值。
输出值按 1 的顺序排列。mutex

  1. 执行go second(...)

  2. 执行rwMutex.Lock()

  3. 所以不要运行,因为写入被锁定!c <- i

  4. 但正在工作。num := <-c

main.go

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

    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

这是不使用 时的输出值。mutex


main.go


func 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

在通道上接收到一个数据后,互斥锁是否有效?


千巷猫影
浏览 95回答 1
1回答

德玛西亚99

使用互斥锁锁定变量时,将阻止后续的 goroutine 锁定互斥体,因为它尚未解锁。num因此,第二个goroutine实际上等到第一个完成睡眠(9秒),然后打印数字1。只有在那一刻,第二个 goroutine 可以锁定互斥体并写入变量 ,但第三个 goroutine 还不能访问,所以它再次等待,直到第二个 goroutine 打印数字,依此类推。num没有互斥体,第一个goroutine的睡眠时间最长,它不会阻止其他人执行和写入,所以它打印了最新的,其他人可以先完成他们的工作,因为睡眠时间更短,完成得更快。num如果删除睡眠状态,则两种情况下的工作方式相同。package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "sync"&nbsp; &nbsp; "time")var (&nbsp; &nbsp; dataSendChannel = make(chan int)&nbsp; &nbsp; rwMutex&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= new(sync.RWMutex))func main() {&nbsp; &nbsp; go first(dataSendChannel)&nbsp; &nbsp; time.Sleep(time.Second * 100)}func first(c chan<- int) {&nbsp; &nbsp; for i := 1; i <= 10; i++ {&nbsp; &nbsp; &nbsp; &nbsp; go second(dataSendChannel)&nbsp; &nbsp; &nbsp; &nbsp; c <- i&nbsp; &nbsp; }}func second(c <-chan int) {&nbsp; &nbsp; rwMutex.Lock()&nbsp; &nbsp; num := <-c&nbsp; &nbsp; fmt.Println("[NUM] : ", num)&nbsp; &nbsp; rwMutex.Unlock()}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go