
select { case l.rConn <- c: default: } if len(l.rConn) < cap(l.rConn) { l.rConn <- c } 1 index90 2021 年 8 月 3 日 当然第一个啊 len(chan) 虽然线程安全的,但很少会这么用,原因是当你前一步执行了 len,下一步就不一定是那个数量了 |
2 CEBBCAT 2021 年 8 月 3 日 当然是第一种,第二种我都看不懂你要做什么。倒立吃饭的感觉 |
3 yeqown 2021 年 8 月 3 日 nonblocking send channel ?那肯定是第一种更通用,容易理解 |
4 SorcererXW 2021 年 8 月 3 日 第二非原子操作,是有问题的 |
5 lysS OP @index90 主要是考虑到性能问题 BenchmarkSelect-8 82773339 16.42 ns/op 0 B/op 0 allocs/op BenchmarkLen-8 738067750 1.571 ns/op 0 B/op 0 allocs/op BenchmarkLenLock-8 35197221 33.51 ns/op 0 B/op 0 allocs/op 而且 l.rConn 只有一处写入,可能有多处读取 |
7 keepeye 2021 年 8 月 3 日 第二种不是原子的,两个线程同时判断可能会有一个阻塞 |
10 sunshinev 2021 年 8 月 3 日 第二个一眼看不懂。。。第二眼也没看懂。。 |
12 index90 2021 年 8 月 3 日 直接让它阻塞在 l.rConn <- c 就好啦,为啥还要 select default 或者 if 来跳过啊。 第二种写法很有可能就会阻塞在 l.rConn <- c 的。 |
14 index90 2021 年 8 月 4 日 @lysS 像上面说的,if len(l.rConn) < cap(l.rConn) 和 l.rConn <- c 不是原子的,所以有阻塞可能。你要非阻塞只能用上面的 select |
15 XTTX 2021 年 8 月 5 日 能用 switch 就不用 if, Bill Kennedy 的淳淳教诲 |