在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)
}
实际的使用场景是,我将上下文传递给一个可能在互斥锁上等待一段时间的函数,我希望能够通过上下文中止等待。
是否有任何机制可以对互斥锁执行类似的操作,即等待通道或互斥锁可用?
否。
您必须重新设计,例如用基于通道的信号量替换互斥。