golang的mutex的误用(defer)

前两天,我的一个golang程序突然出现异常,因为从ramq中读取数据并且自动ack, 然后另外一个线程再读取出来。 中间使用了mutex来防止冲突,结果发现突然不知道什么原因,这个数据竟然没有读到了。

后来分析应该是mutex的原因,然后做了个小测试,就简单的在使用mutex.Lock的后面直接defer mutex.Unlock, 本意很简单,在变量的生命周期结束后直接Unlock,结果发现竟然只会lock,不会unlock。将mutex.Unlock替换为 一个输出函数,结果发现也不会。仔细看了下defer的用法,结果发现defer是在函数结束之前调用的。最后把lock和 unlock以及中间的代码封装为一个内部函数,再次调用就正常了。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据