select调度问题
来源:11-4 用select进行调度

慕先生5976793
2021-03-19
package main
import (
"fmt"
"time"
)
type test struct {
taskChan chan int
quitChan chan struct{}
}
func main() {
t := test{}
t.taskChan = make(chan int)
t.quitChan = make(chan struct{})
//
go func() {
t.taskChan <- 1
fmt.Println("pushed task")
}()
go func() {
// close(t.quitChan)
t.quitChan <- struct{}{}
fmt.Println("closed quit chan")
}()
go t.consume()
time.Sleep(time.Millisecond * 10)
}
func (t *test) consume() {
for {
select {
case task := <-t.taskChan:
fmt.Println("received task:", task)
return
case <-t.quitChan:
fmt.Println("receive close signal")
return
}
}
}
老师,我想问一下上述代码会不会存在quitChan和taskChan同时收到消息,然后select执行了quitChan,此时给taskChan的任务是不是就丢失了?
写回答
1回答
-
是的。
如果不能丢失,我们考虑让发task的人来收quitChan的消息。
012021-03-22
相似问题