美文网首页
多线程删除链表元素宕机问题

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

作者: 李相赫的乐芙兰 | 来源:发表于2018-06-21 09:39 被阅读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两次而造成宕机

    相关文章

      网友评论

          本文标题:多线程删除链表元素宕机问题

          本文链接:https://www.haomeiwen.com/subject/yixqyftx.html