Golang在互斥锁和通道上都选择等待



在golang中,可以使用select语句一次等待多个通道。例如,

package main
import "fmt"
func fibonacci(c, quit chan int) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x+y
case <-quit:
fmt.Println("quit")
return
}
}
}
func main() {
c := make(chan int)
quit := make(chan int)
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
quit <- 0
}()
fibonacci(c, quit)
}

(从https://go.dev/tour/concurrency/5)

是否有任何机制可以对互斥锁执行类似的操作,即等待通道或互斥锁可用?类似于:

package main
import "fmt"
import "sync"
func fibonacci(c chan int, mu sync.Mutex) {
x, y := 0, 1
for {
select {
case c <- x:
x, y = y, x+y
case mu.Lock():
fmt.Println("locked")
return
}
}
}
func main() {
c := make(chan int)
var mu sync.Mutex
go func() {
for i := 0; i < 10; i++ {
fmt.Println(<-c)
}
mu.Lock()
}()
fibonacci(c, quit, mu)
}

实际的使用场景是,我将上下文传递给一个可能在互斥锁上等待一段时间的函数,我希望能够通过上下文中止等待。

是否有任何机制可以对互斥锁执行类似的操作,即等待通道或互斥锁可用?

否。

您必须重新设计,例如用基于通道的信号量替换互斥。

最新更新