一种基于二值计算的多核自旋锁设计方法技术

技术编号:31489745 阅读:18 留言:0更新日期:2021-12-18 12:26
本发明专利技术涉及一种基于二值计算的多核自旋锁设计方法,属于线程同步领域。本发明专利技术依靠两个变量nextTicket与ticketInService,nextTicket与ticketInService成对计数;当nextTicket计数值小于ticketInService计数值时,表示自旋锁pLock未被任何线程获取持有;当nextTicket计数值等于ticketInService计数值时,表示当前仅有一个线程获取到自旋锁pLock,执行本线程的临界保护区程序;当nextTicket计数值大于ticketInService计数值时,表示存在两个及以上的线程尝试获取自旋锁pLock,当前自旋锁保持者执行临界保护区程序,其他尝试获取pLock的线程将会自旋。本发明专利技术可以确保系统线程按照获取自旋锁的先后顺序访问/操作共享资源,安全有效的解决天熠多核多线程中的线程同步问题。同步问题。同步问题。

【技术实现步骤摘要】
一种基于二值计算的多核自旋锁设计方法


[0001]本专利技术属于线程同步领域,具体涉及一种基于二值计算的多核自旋锁设计方法。

技术介绍

[0002]目前,天熠嵌入式操作系统已经成功完成对Arm、Mips、I386以及PowerPC等单核硬件架构处理器的系统适配,并在多款型号项目中成功应用。但在面向多核处理器适配时,存在不同CPU核下的不同线程同时访问/操作系统内共享资源的现象,导致系统共享资源无法被安全保护(互斥访问/操作),出现有系统运行异常的问题,甚至系统宕机。
[0003]针对天熠嵌入式操作系统面向多核处理器适配时遇到的共享资源保护问题,需要自主设计并实现一套嵌入到天熠系统内核层的锁机制——自旋锁。

技术实现思路

[0004](一)要解决的技术问题
[0005]本专利技术要解决的技术问题是如何提供一种基于二值计算的多核自旋锁设计方法,以解决天熠多核多线程中的线程同步问题。
[0006](二)技术方案
[0007]为了解决上述技术问题,本专利技术提出一种基于二值计算的多核自旋锁设计方法,该方法依靠两个变量的计数实现的,这两个变量是指自旋锁pLock的两个成员变量nextTicket与ticketInService,其中,nextTicket为某个CPU核上的某个线程尝试获取自旋锁pLock的计数值,ticketInService为自旋锁pLock的当前持有线程执行完临界保护区程序后释放自旋锁的计数值,nextTicket与ticketInService成对计数;r/>[0008]1)当nextTicket计数值小于ticketInService计数值时,表示自旋锁pLock未被任何线程获取持有;
[0009]2)当nextTicket计数值等于ticketInService计数值时,表示当前仅有一个线程获取到自旋锁pLock,执行本线程的临界保护区程序;
[0010]3)当nextTicket计数值大于ticketInService计数值时,表示存在两个及以上的线程尝试获取自旋锁pLock,当前自旋锁保持者执行临界保护区程序,其他尝试获取pLock的线程将会自旋。
[0011]进一步地,该自旋锁设计方法包括4个接口函数,分别为自旋锁初始化接口函数、获取自旋锁接口函数、释放自旋锁接口函数以及删除自旋锁接口函数。
[0012]进一步地,自旋锁初始化接口函数spinLockTaskInit()申请自旋锁pLock对象内存空间,按默认属性对其实例化,并初始化自旋锁pLock的成员变量nextTicket与ticketInService值为0。
[0013]进一步地,获取自旋锁接口函数spinLockTaskTake()将pLock的成员变量nextTicket值加1,并赋值给函数内局部变量my_tick;然后获取pLock的成员变量ticketInService赋值给函数内局部变量now_serving;最后进入循环判断now_serving是
否等于my_tick,如果二者相等,则当前线程退出循环继续执行,如果不等,则进入循环体内获取ticketInService值并赋值给now_serving,直至my_tick与now_serving相等后,退出循环体继续执行。
[0014]进一步地,释放自旋锁接口函数spinLockTaskGive()将pLock的成员变量ticketInService值加1。
[0015]进一步地,删除自旋锁接口函数spinLockTaskDestroy()删除自旋锁pLock,并释放其占用的内存空间。
[0016]进一步地,在获取和释放自旋锁函数体执行前后禁用和打开中断。
[0017]进一步地,该方法应用于天熠嵌入式操作系统。
[0018]本专利技术还提供一种基于二值计算的多核自旋锁设计方法,嵌入式操作系统运行于4核处理器,主线程M运行于0核,其他3个子线程A、B、C分别运行于1、2、3核;
[0019]步骤一,系统启动后自旋锁初始化:
[0020]初始化启动时,主线程M调用函数spinLockTaskInit()完成对pLock的初始化,然后调用函数spinLockTaskGive()首次释放pLock,此时pLock处于可获取状态,nextTicket值为0,ticketInService值为1,nextTicket小于ticketInService;
[0021]步骤二,某核的线程首次获取自旋锁pLock:
[0022]线程A调用函数spinLockTaskTake()首先获取pLock,成员变量nextTicket加1后并赋值给my_tick,此时值为1,now_serving被赋值为ticketInService,此时值为1,now_serving等于my_tick,线程A退出循环,进入临界保护区执行受保护的代码段;
[0023]步骤三,线程A释放pLock前,其他线程获取pLock:
[0024]线程A执行临界保护区程序时,并未释放pLock,此时线程B调用函数spinLockTaskTake()获取自旋锁pLock,成员变量nextTicket加1后并赋值给my_tick,此时值为2,now_serving被赋值为ticketInService,此时值为1,now_serving不等于my_tick,线程B进入循环体,处于自旋状态;
[0025]如果此时3核线程C继线程B之后也来获取pLock,成员变量nextTicket加1后并赋值给my_tick,此时值为3,now_serving被赋值为ticketInService,此时值为1,now_serving不等于my_tick,线程C进入循环体,处于自旋状态;
[0026]步骤四,线程A执行完临界保护区程序,成功释放pLock:
[0027]线程A执行完pLock保护的临界保护区程序,调用函数spinLockTaskGive()释放pLock,成员变量ticketInService值加1;此时线程B和线程C均获取ticketInService的值,此时值为2,并赋值给now_serving,满足线程B退出循环体的条件,线程B优先退出循环执行临界保护区程序,线程C依旧处于自旋状态;
[0028]当线程B执行完临界保护区程序,调用函数spinLockTaskGive()成功释放pLock,成员变量ticketInService值加1,此时值为3,线程C获取ticketInService的值,并赋值给now_serving,此时值为3,满足线程C退出循环体的条件,线程C退出循环执行临界保护区程序,然后调用函数spinLockTaskGive()释放pLock,pLock成员变量ticketInService值加1,此时值为4,nextTicket计数值小于ticketInService计数值;
[0029]步骤五,删除自旋锁pLock:
[0030本文档来自技高网...

【技术保护点】

【技术特征摘要】
1.一种基于二值计算的多核自旋锁设计方法,其特征在于,该方法依靠两个变量的计数实现的,这两个变量是指自旋锁pLock的两个成员变量nextTicket与ticketInService,其中,nextTicket为某个CPU核上的某个线程尝试获取自旋锁pLock的计数值,ticketInService为自旋锁pLock的当前持有线程执行完临界保护区程序后释放自旋锁的计数值,nextTicket与ticketInService成对计数;1)当nextTicket计数值小于ticketInService计数值时,表示自旋锁pLock未被任何线程获取持有;2)当nextTicket计数值等于ticketInService计数值时,表示当前仅有一个线程获取到自旋锁pLock,执行本线程的临界保护区程序;3)当nextTicket计数值大于ticketInService计数值时,表示存在两个及以上的线程尝试获取自旋锁pLock,当前自旋锁保持者执行临界保护区程序,其他尝试获取pLock的线程将会自旋。2.如权利要求1所述的基于二值计算的多核自旋锁设计方法,其特征在于,该自旋锁设计方法包括4个接口函数,分别为自旋锁初始化接口函数、获取自旋锁接口函数、释放自旋锁接口函数以及删除自旋锁接口函数。3.如权利要求2所述的基于二值计算的多核自旋锁设计方法,其特征在于,自旋锁初始化接口函数spinLockTaskInit()申请自旋锁pLock对象内存空间,按默认属性对其实例化,并初始化自旋锁pLock的成员变量nextTicket与ticketInService值为0。4.如权利要求2所述的基于二值计算的多核自旋锁设计方法,其特征在于,获取自旋锁接口函数spinLockTaskTake()将pLock的成员变量nextTicket值加1,并赋值给函数内局部变量my_tick;然后获取pLock的成员变量ticketInService赋值给函数内局部变量now_serving;最后进入循环判断now_serving是否等于my_tick,如果二者相等,则当前线程退出循环继续执行,如果不等,则进入循环体内获取ticketInService值并赋值给now_serving,直至my_tick与now_serving相等后,退出循环体继续执行。5.如权利要求2所述的基于二值计算的多核自旋锁设计方法,其特征在于,释放自旋锁接口函数spinLockTaskGive()将pLock的成员变量ticketInService值加1。6.如权利要求2所述的基于二值计算的多核自旋锁设计方法,其特征在于,删除自旋锁接口函数spinLockTaskDestroy()删除自旋锁pLock,并释放其占用的内存空间。7.如权利要求1

6任一项所述的基于二值计算的多核自旋锁设计方法,其特征在于,在获取和释放自旋锁函数体执行前后禁用和打开中断。8.如权利要求1所述的基于二值计算的多核自旋锁设计方法,其特征在于,该方法应用于天熠嵌入式操作系统。9.一种基于二值计算的多核自旋锁设计方法,其特征在于,嵌入式操作系统运行于4核处理器,主线程M运行...

【专利技术属性】
技术研发人员:徐治纬洪冯李明磊张杨赵晓燕于然
申请(专利权)人:北京计算机技术及应用研究所
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1