发明名称 一种数据库中自旋锁的实现方法
摘要 本发明公开了一种数据库中自旋锁的实现方法,其特征在于,一种数据库中自旋锁的实现方法,其特征在于,在共享内存中存储两个全局变量,一个是自旋锁变量,另一个是ID变量,系统初始化时两个变量被初始化为0;采用自旋锁变量高位存储值来记忆当前已持自旋锁线程,并根据该存储值在持锁线程异常退出导致死锁时,实现自旋锁自动解锁。本发明避免出现上述多个任务竞争同一个自旋锁时可能出现的死锁情况,并通过改进加锁流程及死锁判决流程,使自旋锁能够保护在数据结构上一段较长时间的操作,并能处理期间加锁线程的异常结束导致的死锁问题。
申请公布号 CN102129391B 申请公布日期 2013.08.28
申请号 CN201110060572.5 申请日期 2011.03.14
申请人 华中科技大学 发明人 王非;黄本雄;刘维;邓磊
分类号 G06F9/46(2006.01)I 主分类号 G06F9/46(2006.01)I
代理机构 北京市德权律师事务所 11302 代理人 周发军
主权项 一种数据库中自旋锁的实现方法,其特征在于,在共享内存中存储两个全局变量,一个是自旋锁变量,另一个是ID变量,系统初始化时两个变量被初始化为0;在加锁操作时,按如下步骤:步骤101,用原子操作读取ID变量中的值,并将ID变量加1;步骤102,将第101步中读取的ID值与自旋锁加锁后的的自旋锁变量值合成第一变量值N,合成方法是:低位存储自旋锁变量,高位存储ID值;步骤103,以原子操作访问自旋锁变量,尝试加锁操作;步骤104,若自旋锁变量值为未占用,则加锁成功,将步骤102合成的第一变量值N以原子操作存入自旋锁变量,对自旋锁变量的访问和将值存于自旋锁变量是原子的;步骤105,若自旋锁变量值为已占用,加锁不成功则进入死锁判决流程,如果未出现死锁,则处理器自旋等待,转入步骤103进行加锁尝试;如果判断出现死锁;则转入步骤106解自旋锁,并重新转入步骤103;步骤106,解自旋锁;上述步骤105中所述的死锁判决流程,按如下步骤进行:步骤201,将自旋锁变量的高位ID值存储于线程的一个临时变量中,记为LHold;步骤202,将分配给此线程的ID值与自旋锁变量已加锁变量值合成第一变量值N;合成方法如下:第一变量值N低位存储自旋锁变量,高位存储ID值;步骤203,原子操作探测自旋锁变量值,判断是否可以加锁;步骤204,如果自旋锁可以加锁,则将第一变量值N存于自旋锁变量,其中对自旋锁变量的探测和存储是原子的,自旋锁加锁成功并返回;步骤205,如果自旋锁不能被加锁,处理器空转一次;对空转次数累加计数;步骤206,如果空转次数不超过设定阈值,则转入步骤203;否则转入步骤207;步骤207,对休眠次数累计加1,判断休眠次数是否超过设定阈值,如果超过设定阈值则转入步骤208;否则转入步骤211;步骤208,将LHold与自旋锁加锁后的自旋锁变量值合成第二变量值Y,合成方法如下:Y的低位存储自旋锁加锁后的自旋锁变量值,高位存储LHold值;步骤209,原子操作比较自旋锁变量值与Y值是否相等,如果相等,则判定自旋锁死锁,并将自旋锁解锁,其中判定自旋锁变量值与Y值相等的操作与自旋锁解锁的操作是原子的;步骤210,重新获取自旋锁变量的高位ID值,存储于LHold,并将休眠计数清零,线程休眠一段随机时间,转入步骤211;步骤211,线程休眠一次,休眠一段随机时间,随机时间在1毫秒到1秒之间,并将空转次数计数清零。
地址 430074 湖北省武汉市洪山区珞喻路1037号