select {
case l.rConn <- c:
default:
}
if len(l.rConn) < cap(l.rConn) {
l.rConn <- c
}
1
index90 2021-08-03 10:27:47 +08:00
当然第一个啊
len(chan) 虽然线程安全的,但很少会这么用,原因是当你前一步执行了 len,下一步就不一定是那个数量了 |
2
CEBBCAT 2021-08-03 11:00:07 +08:00
当然是第一种,第二种我都看不懂你要做什么。倒立吃饭的感觉
|
3
yeqown 2021-08-03 11:04:22 +08:00
nonblocking send channel ?那肯定是第一种更通用,容易理解
|
4
SorcererXW 2021-08-03 12:46:24 +08:00
第二非原子操作,是有问题的
|
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-08-03 15:13:16 +08:00
第二种不是原子的,两个线程同时判断可能会有一个阻塞
|
10
sunshinev 2021-08-03 20:41:25 +08:00
第二个一眼看不懂。。。第二眼也没看懂。。
|
12
index90 2021-08-03 23:57:58 +08:00
直接让它阻塞在 l.rConn <- c 就好啦,为啥还要 select default 或者 if 来跳过啊。
第二种写法很有可能就会阻塞在 l.rConn <- c 的。 |
13
lysS OP |
14
index90 2021-08-04 10:47:12 +08:00
@lysS 像上面说的,if len(l.rConn) < cap(l.rConn) 和 l.rConn <- c 不是原子的,所以有阻塞可能。你要非阻塞只能用上面的 select
|
15
XTTX 2021-08-05 11:20:56 +08:00
能用 switch 就不用 if, Bill Kennedy 的淳淳教诲
|