-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
数组越界BUG #4
Comments
大佬,帮忙Review |
你写了一个比之前复杂的保证安全的逻辑,但仔细看,还是会有问题
你不能保证你在m.synCond.Broadcast()时,所有其他协程都在m.synCond.Wait() 虽然Wait方法里面会在添加监听后,释放锁,让别的协程可以进来,但是依然存在着我上面说的那种情况发生的概率; |
你把workers从数组改成了双map进行切换,但你写的并没有达到目标,只是map在获取的时候,可以检查而已,并不需要双map |
还有一个问题,那就是你的双map是同一个map,导致一修改数量,就会出现 |
给你一段测试代码。 |
记的多跑几次,几个问题都会暴露出来的。 |
感谢,这段工作较忙,问题已经修复,使用了sync.Map,您的测试用例已通过。再次感谢 |
你的代码需要优化。用了好多互斥锁。单线程,原子锁。 |
还请指点,resetGuard里面是多,但是这段代码执行少,复杂度可以忽略吧 |
Master.resetGuard |
确保只有一个协程能重置m.cursor |
原因呢? |
还有就是getWorker为什么是递归?不应该是循环吗? |
|
当cursor与原ingNum相等时,你要进行缩容
这个时候,如果是先把ingNum改成了新的值,再
atomic.CompareAndSwapInt64(&m.cursor, m.ingNum, 0)
运行这行时,就不会修改成功,然后你对cursor,进行了累加,导致越界,或有可能拿到一个nil对象。
还有就是你的代码里,对workers初始化的时候,用的是maxNum
但后面修改的时候,又用了ingNum做为他的长度。
我原以为你是要一开始声明一个确定长度的数组。但后面又换了,如果按你后面的逻辑
你一开始应该是
workers: make([]*worker, initNum,maxNum)
才对。
The text was updated successfully, but these errors were encountered: