Golang选择并锁定

时间:2018-06-20 11:17:40

标签: go

以下是我一直在玩的一些代码:

package main

import "fmt"

func main() {
    channel := make(chan int)

    flag := false

    go func() {
        for {
            channel <- 1
        }
    }()

    for {
        select {
        case <-channel:
            fmt.Println(flag)

            if !flag {
                flag = true
                break
            }

            fmt.Println(flag)
        }
    }
}

我希望在那里至少有一个false,但是当我执行代码时,我只会得到true。有人可以解释为什么吗?

我确定它与锁有关,但是当我尝试将case内容包装在锁周围时,我得到了false(最后!),然后是fatal error: all goroutines are asleep - deadlock!

for {
    select {
    case <-channel:
        mutex.Lock()
        fmt.Println(flag)

        if !flag {
            flag = true
            break
        }

        fmt.Println(flag)
        mutex.Unlock()
    default:
        // no communication
    }
}

1 个答案:

答案 0 :(得分:0)

没有理由用互斥锁使flag变形,因为它周围的代码不是并发的。

您可以在https://play.golang.org/p/OJue5lcIZlw处检查代码,它确实会打印第一个false

为什么您会收到leaf bebop所说的错误,原因是因为您破坏了代码,陷入了试图锁定锁定的互斥锁的死锁。

您可以使用defer mutex.Unlock() 或在break之前解锁以解决该问题。