Golang实践经验和教训( 八 )

newTimeout := NewTimeoutHandler(synCallback session SYN_TIMEOUT_DURATION)

newTimeout.Register()

sessionTimeout[state
= newTimeout

该回调将在新的超时处理程序中重新安排时间 , 并更新全局sessionTimeout映射 。

数据竞争和引用

一个简单的测试是检查计时器到期后是否执行了超时回调 。 为此 , 注册一个超时 , 在其持续时间内休眠 , 然后检查回调操作是否已完成 。 执行测试后 , 最好取消预定的超时时间 , 因此不会在测试之间产生副作用 。 令人惊讶的是 , 这个简单的测试在发现了解决方案中的一个错误 。 使用cancel方法取消超时没有完成其工作 。 以下事件顺序将导致数据争用情况:

1.有一个计划的超时处理程序 。

2.线程1:

a)收到一个控制数据包 , 现在要取消注册的超时并进入下一个会话状态 。 (例如 , 发送了SYN后收到了SYN-ACK) 。

推荐阅读