```
n := make(chan int)
go func(){
k:=<-n
fmt.Prinln("1");
}()
go func(){
k:=<-n
fmt.Prinln("2")
}
n<-1
time.Sleep(1)
```
上述这种情况,一个channel被多个go协程接受时,有没有一种方法,能确定谁能先接受?
1.如果不加条件变量设置的话,两个协程是没法确认谁先收到的。而且一个收到以后另一个必定会阻塞。你可以让代码按照顺序正确执行,但是你是无法控制go的调度器的,所以这个你是没法确认的。在非缓存channel中,发送方向channel里面发送一个值,channel会把这个值的备份发给channel的接收方,而且接收方一定会在发送方结束之前接收到这个值的副本。
2.如果你想控制它的顺序,理论上可以加一个信号控制的channel。也可以使用select,但是使用select在你这里会造成错误。
3.你写的代码存在一些低级的错误,麻烦以后确认好了再发给大家。
#6
更多评论