go语言的看(te)点(se)在哪里( 三 )

for { if s.closed { close(s.updates) return } items, next, err := s.fetcher.Fetch() if err != nil { s.err = err time.Sleep(10 * time.Second) continue } for _, item := range items { s.updates \u0026lt;- item } if now := time.Now(); next.After(now) { time.Sleep(next.Sub(now)) } }loop线程是一个无线循环,主线程可以调用Close()方法停止loop线程:func (s *naiveSub) Close() error { s.closed = true return s.err}可以看出,对s.closed和s.err的读写会造成各种race,其中一种如下图所示。go语言的看(te)点(se)在哪里
【go语言的看(te)点(se)在哪里】
可以使用channel避免race:通过在loop线程监听s.closing(类型是chan chan error),得到errc(类型是chan error),通过它来传输err。func (s *sub) Close() error { errc := make(chan error) s.closing \u0026lt;- errc return \u0026lt;-errc}新的loop线程: var err error // set when Fetch fails for { select { case errc := \u0026lt;-s.closing: errc \u0026lt;- err close(s.updates) // tells receiver we\u0026#39;re done return\t\t...\t\t... } }============我也是初学golang,刚从学校滚蛋的毕业生一枚,从事linux c++编码工作,对java了解比较少,答案中不对的地方还请各位指教~


推荐阅读