william.chen

Results 12 comments of william.chen

gethostbyname / getaddrinfo 等函数的实现内部都使用了TLS。 dns 查询过程中网络收发包有概率会导致协程被worksteal到另一个线程上,会导致TLS 变量数据异常。 @yyzybb537

@yyzybb537 出现类似问题,连续调用write写入大量数据的时候,有时候会阻塞住,netstat 可以看到send buf 和 recv buf 都有大量数据,但是上层应用没有读走。

我感觉是 epoll 边沿触发处理有问题。 我这边的例子,客户端是用原生socket实现的,服务端用libgo实现。 异常发生后,客户端进程退出,服务端无法感知,仍然是established状态,接收队列里有很大的值,应该是已经没有在读取数据了。 猜想应该是边沿触发后,数据没读完,之后就没在触发了。

关联了很多业务逻辑,不好单独抽出来。 不过有一个地方值得注意的,我在关闭worksteal时,有两处地方,第一处“阻塞线程的任务steal出来” 去掉后,问题还在,第二处“如果还有在等待的线程, 从任务多的线程中拿一些给它” 去掉后,问题解决。 另外我在只去掉第一处时,发现仍然会steal,这时stealN值是0,变成了偷取全部,但实际上里面只有一个任务,应该不需要偷取才对。 ![image](https://user-images.githubusercontent.com/1276668/63402470-202e4400-c40e-11e9-9153-88c2cafab385.png)

1. 为啥没有 WaitGroup的 add 接口,干脆类名就叫WaitGroup就好了。 2. --mFlyingCount 操作不是原子的,多线程会有风险。是不是换成 atomic 3. 直接yield,如果是任务比较少的情况下,cpu会占满吧?

1. 动态创建携程的时候很有用,比如http 服务器, 可以等待所有请求都结束后再关闭服务。 2. 3. 这个实现感觉还是比较奇怪,为啥不采用信号的方式?比如wait 在channel 上, done 的时候写chan, wait 唤醒后检查下计数。

换成在done 的时候判断计数为0再close chan, wait 直接block 在read chan 上?

我感觉是需要提供一个类似go里面的waitgroup的组件。

@yyzybb537 ![image](https://user-images.githubusercontent.com/1276668/86077720-1447ef80-babf-11ea-97aa-1626cec4eeae.png)