Golang实践经验和教训(12)

if timeout.cancelChan == nil {

return

timeout.cancelChan <- struct{{

这种方法为注册的每个超时提供了一个cancel通道 。 取消调用将一个空结构发送到通道并触发取消 。 但是 , 这也不能解决先前的问题;超时可能会在通过通道调用Cancel之前以及超时线程获取锁之前到期 。

对应的解决方案是在锁之后检查超时范围内的cacel通道 。

case _ = <- time.AfterFunc(time.Duration(timeout.duration) * time.Second):

func () {

stateLock.Lock()

defer stateLock.Unlock()

select {

case _ = <- handler.cancelChan:

return

推荐阅读