Golang实践经验和教训(14)

func (timeout* TimeoutHandler) Cancel() {

if timeout.cancelChan == nil {

return

select {

case timeout.cancelChan <- struct{{:

default:

// can't send on the channel someone has already requested the cancellation.

结论

实践中了解了在使用并发代码时出现常见的常见错误 。 由于其不确定性 , 即使进行大量测试 , 也很容易发现这些问题 。 这是HALO在实现中遇到的三个主要问题:

在不同步的情况下更新共享数据

这似乎很明显 , 但是如果同时进行的更新发生在不同的位置 , 则实际上很难发现 。 结果是数据竞争 , 由于一个更新会覆盖另一个更新 , 对同一数据的多次更新可能导致更新丢失 。 在HALO中 , 正在更新同一共享映射上的计划超时参考 。 (有趣的是 , 如果Go在同一个Map对象上检测到并发读/写操作 , 会引发致命错误 , 可以尝试运行Go的数据竞争检测器) 。 最终会导致丢失超时引用 , 并且无法取消给定的超时 。 不要是可以使用锁 。

推荐阅读