有两个工作线程:
主线程接受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两次而造成宕机
网友评论