多线程删除链表元素宕机问题

2018-06-21  本文已影响22人  李相赫的乐芙兰

有两个工作线程:

主线程接受http请求,将请求放入请求队列

副线程从请求队列中取出请求,处理结果,将处理完的请求放入结果队列

主线程从结果队列中取出请求,返回结果,并delete掉请求

请求除了会被放入请求、结果两个队列中外,在处理时还会被加入到处理中、处理完成的双向链表中

副线程会循环遍历处理完成的链表,将其中的请求放入结果队列,并从链表中删除这个请求

主线程在delete请求时,在请求类的析构函数中也会将请求从链表中删除(调用Remove操作)

双向链表类的Remove函数实现:

void Remove(){

prev->next = next; ///A

next->prev = prev;  ///B

next = this; ///C

prev = this; ///D

head = this; ///E

}

主线程和副线程都会依次执行A-E这5步,考虑这样一种情况:

主线程执行完ABC这3步,这时候副线程开始执行A

由于主线程中还没有执行D,prev还是当前节点的前继节点,当副线程再次执行prev->next = next;时,由于此时next在主线程中已经被赋值为this,

所以副线程执行完A后又将前继节点的后继指向了当前节点,于是当前节点又被加回了链表中,下一次遍历时又会被遍历,从而在主线程中请求对象会被delete两次而造成宕机

上一篇下一篇

猜你喜欢

热点阅读