主权项 |
一种数据库中自旋锁的实现方法,其特征在于,在共享内存中存储两个全局变量,一个是自旋锁变量,另一个是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秒之间,并将空转次数计数清零。 |