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

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

作者: 李相赫的乐芙兰 | 来源:发表于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两次而造成宕机

相关文章

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

    有两个工作线程: 主线程接受http请求,将请求放入请求队列 副线程从请求队列中取出请求,处理结果,将处理完的请求...

  • 83-删除链表中重复的元素(留下一个)

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 脑袋宕机,想了好久。 重复的节点跳过,不就行了。

  • [LintCode]删除链表中的元素

    原文发表在我的博客:删除链表中的元素求关注、求交流、求意见、求建议。 问题 LintCode:删除链表中的元素 描...

  • Swift - LeetCode - 删除排序链表中的重复元素

    题目 删除排序链表中的重复元素 问题: 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例: 解...

  • 单链表和双链表

    单链表(可以用来实现栈和队列) 删除链表的元素 添加元素 双向链表(实现LinkedList) 添加元素 删除元素

  • Swift - LeetCode - 删除链表中的节点

    题目 删除链表中等于给定值 val 的所有节点。 问题: 给定一个排序链表,删除所有重复的元素,使得每个元素只出现...

  • 双向循环链表

    双向循环链表 初始化 添加元素 删除元素 输出整个链表 实现代码 尚未实现 bclist_free删除链表所有元素

  • python数据结构——单链表

    链表 python实现链表链表的初始化创建元素的插入和删除链表的遍历元素的查询链表的删除链表的逆序判断链表是否有环...

  • 数据结构之链表及其栈和队列的实现

    链表的基本操作 定义 从链表头部插入元素 从链表头部删除元素 从链表尾部插入元素 从中间插入和删除结点 栈和对列的...

  • 线性表-双向链表与双向循环链表

    双向链表 双向链表示意图如下: 数据结构定义 创建双向链表 双向链表插入元素 双向链表删除元素 双向链表打印元素 ...

网友评论

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

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