某次面试谈到无锁双向链表

原创 2018年04月16日 03:46:43

面试官让实现无锁双向链表,在不考虑删除的前提下把插入实现了

当时还没开始想具体怎么实现,我就随口先说了脑子里都是浆糊,其实我那会儿是刚准备进行构思,可能被误以为是放弃了挑战。

后来回家以后当然是把问题解决了,问题不大。

并且实现了insert_before和insert_after,从完备性角度看,应该要提供这两个而不是像std的insert(after),有无锁素养的人应该都能很轻松的想到这点。

因为可能会出现{a,b}   

insert_before(b, x)和insert_after(a, y)同时执行 

=> insert_after(before(b), x) 和insert_after(a,y)同时执行

可能性1   insert_after(a,y) -> insert_after(before(b), x) => {a,y,b} ->{a,y,x,b}

可能性2   insert_after(before(b), x) -> insert_after(a,y) => {a,x,b} -> {a,y,x,b}

可能性3   ?=before(b) -> insert_after(a,y) ->insert_after(?, x) -> => {a,y,b} -> {a,x,y,b}

可能性3是违背两个insert本意的。所以不难想到应该分别提供insert_before和insert_after。


那么现在来想想有删除的情况。

其实如果考虑到删除,通用无锁双向链表{a,b,c}就站不住脚了:

当一个线程A正在使用a的数据时,线程B遍历到a并且想要删除a,很显然会造成A对a的读取发生致命错误。

那么好像只能用类似引用计数的方案对a节点加锁,使A读取a时,B无法删除a。

由于lockfree_double_link_list<DataType>的DataType应该是通用,所以不可能在DataType里有引用计数,

那么只能让ListNode<DataType>携带引用计数了,而且很显然的就算不考虑DataType的锁,

Node本身在某线程A遍历并正好读取其值时,另一个线程B就不允许删除这个Node。但是如果每次遍历经过NodeA就需要对NodeA进行加锁,那为什么不直接对整个链表加锁呢?对每个节点加锁显然不能让性能提升(仅有一种情况就是多个线程分别操作链表的某个片段,可以做到互不干涉,但即便如此仍然谈不上有加速作用),那么整个链表的无锁就毫无意义。

所以通用双向无锁链表根本没有存在的理由了。

除非,DataType不通用,或有一套释放体系,或者应用层不持有Node的迭代器

双向无锁链表(未完成)

看到一些大牛关于无锁双向
  • eagleatustb
  • eagleatustb
  • 2014-04-11 16:21:04
  • 1140

面试题之双向链表简单详述

双向链表其实是单链表的改进,对单链表进行操作时,有时要对某个节点的直接前驱进行操作,又必须从表头开始查找。由于单链表每个节点只有一个直接后继节点存储地址的练域,因此运用单链表无法办到,这样就引出了一个...
  • shiren_Bod
  • shiren_Bod
  • 2011-07-28 19:15:19
  • 3385

360面试经验

意料之中,果然 第一次大公司面试,一面就挂了,面的是PC网游c++。这个职位对服务器,线程,和进程要求的知识比较多。 开始先让我自我介绍,肯定要自夸一顿,把成绩,获奖,项目都说一遍。然后他说项目挺多,...
  • qq_18884827
  • qq_18884827
  • 2016-08-24 17:41:08
  • 310

常见面试题手写双向循环链表

public class DoubleLink { private class Node { public E value; // 节点值 public Node prev; // 前一个...
  • u014574317
  • u014574317
  • 2017-11-16 10:32:21
  • 122

某次面试

听说某公司在武汉2500$/m巨兴奋,跑去面试。虽然消息是假的,但是面试还是挺有收获的。题目是 写一个通用的,简单的计算x的n次幂的函数power(x,n)用了不到一分钟,就把他搞定了。int pow...
  • CQ8587
  • CQ8587
  • 2007-03-22 22:50:00
  • 1114

大公司面试题之二叉查找树转双向链表

作者:云梦泽 日期:2013.11.13 地点:软件大楼211 心情:复杂 1、题目 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。 比如: ...
  • u012333003
  • u012333003
  • 2013-11-13 20:27:48
  • 1177

数据结构面试之二——双向链表表、循环链表、有序链表的常见操作

数据结构面试之二——双向链表表、循环链表、有序链表的常见操作 题注:《面试宝典》有相关习题,但思路相对不清晰,排版有错误,作者对此参考相关书籍和自己观点进行了重写,供大家参考。 二、双向链...
  • mark555
  • mark555
  • 2014-03-08 10:04:09
  • 451

双向链表的建立以及输出

 关于双向循环链表的建立        /* 这个是一个双向链表的建立*/   #include "stdio.h"    #define NULL 0    #define N 5     #def...
  • jasperu
  • jasperu
  • 2010-05-13 13:46:00
  • 1255

如何应对面试官的闲扯

原文地址:https://club.1688.com/article/31815895.htm 上期我们谈了应对压力面试问题,求职应聘者往往面临面试紧张的环节,甚至压力非常大。但是也有时候,在这...
  • huangjingfeng2016
  • huangjingfeng2016
  • 2017-10-17 18:02:46
  • 72

js数据结构之双向链表

双向链表和普通链表的区别在于,在链表中,一个节点只有链向下一个节点的链接,而在双向链表中,链接是双向的:一个链向下一个元素,另一个链向前一个元素。 双向链表提供了两种迭代列表的方法:从头到尾,或者反...
  • shelly1072
  • shelly1072
  • 2017-06-20 11:09:50
  • 383
收藏助手
不良信息举报
您举报文章:某次面试谈到无锁双向链表
举报原因:
原因补充:

(最多只允许输入30个字)