首页 新闻 会员 周边

可能是锁的问题

0
悬赏园豆:20 [已解决问题] 解决于 2008-08-14 09:12
<P><FONT size=2>我在做一个线程池,我想取消一项在任务队列或是正在执行的任务,如果这项任务在我想abort时已经执行完了就什么也不要做。</FONT></P> <P><FONT size=2>具体的情景时:当我想Abort一个任务时,如果它在任务队列Queue&lt;Param&gt;中我移除它,可是正当我要移除它时,有了空闲的线程,它自己已经从任务队列中移除,在线程池中执行了,而当我想在线程池中(我的一个哈希储存了Dictionary&lt;Thread,Param&gt;线程对象)找到这个线程实例并Abort它时,这个任务已经正常的结束了,我再Abort这个线程,此时这个空闲线程又引入了新的任务,当我真正Abort掉的是一个另一个任务</FONT></P> <P><FONT size=2>这里有两个非种特殊的情况,怎么避免其发生,能否给个简单的示例</FONT></P> <P><FONT size=2></FONT>&nbsp;</P>
lexus的主页 lexus | 初学一级 | 园豆:0
提问于:2008-08-09 09:11
< >
分享
最佳答案
0
楼主其实是把简单问题复杂化了,呵呵。 理清一下思路可能更好的解决该问题。 当要放弃某个任务时: 1.检测到这个任务还在任务队列里等待,还未被执行。 lock(队列),这时只有持有该锁的线程才能工作,所以那些特殊情况不成立。直接移除即可。 2.检测到这个任务已经从任务队列里移除,线程池中的线程正在执行,但还未执行完。 这种情况最麻烦,再细分一下: A.如果线程池的实现可以通过任务直接找到正在执行的线程,直接把线程中断(细节自行处理).楼主这里通过哈希表来保存其对应关系是不正确的,因为没有办法保证其正确性和安全性。 B.大多数线程池都不会如 A 所说的那样实现,所以我们要查找正在执行该任务的线程,要再次细分一下可能的情况: a. 查找过程中,找到该线程,且任务并未结束,把线程中断 b.查找过程中,任务结束,直接返回。 3.检测到任务已经结束,直接返回。
Angel Lucifer | 小虾三级 |园豆:775 | 2008-08-09 16:59
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册