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 的淳淳教诲
|