[发明专利]一种多核环境下基于数组结构的无等待栈操作方法有效
申请号: | 201611186222.2 | 申请日: | 2016-12-20 |
公开(公告)号: | CN106843806B | 公开(公告)日: | 2019-04-26 |
发明(设计)人: | 彭亚琼;郝志宇;刘永继;李大辉;崔磊 | 申请(专利权)人: | 中国科学院信息工程研究所 |
主分类号: | G06F9/30 | 分类号: | G06F9/30;G06F9/52 |
代理公司: | 北京君尚知识产权代理事务所(普通合伙) 11200 | 代理人: | 司立彬 |
地址: | 100093 *** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 多核 环境 基于 数组 结构 等待 操作方法 | ||
1.一种多核环境下基于数组结构的无等待栈操作方法,其步骤为:
1)主程序初始化代表栈的全局数组,即分配一个包含N个数组元素的段;其中,每个数组元素包含用于存储入栈数据的变量val,指向入栈请求的指针push,以及指向出栈请求的指针pop;初始化两全局共享变量T、pc;其中,T为栈顶索引,pc为指示出栈请求的标识符;
2)启动m个线程,每个线程thi维护一存储自己运行状态的变量hi;该变量hi包含指针next、入栈伙伴指针和出栈伙伴指针;其中,线程thi的入栈伙伴指针和出栈伙伴指针均初始指向线程thi;
3)利用变量hi中的next指针,将该m个线程的运行状态链接为环状;
4)该主程序等待接收线程对栈进行操作的请求;当线程thi对栈进行操作时,如果该线程thi的操作请求为入栈请求,则该线程thi执行无等待入栈操作;如果该线程thi的操作请求为出栈请求,则该线程thi执行无等待出栈操作;如果该线程thi的操作请求为栈的销毁请求,则该主程序首先销毁栈,然后包括主程序在内的所有线程结束执行;
其中,所述无等待入栈操作为:首先利用比较并交换原子操作,尝试将入栈数据直接存入栈顶元素的val变量,当存入失败的次数超过给定阈值P后,会在本线程的运行状态中公布本次入栈请求;其它线程会在执行无等待出栈操作时,尝试为该入栈请求指定合适的入栈位置,以协助该入栈请求的完成;
所述无等待出栈操作为:首先读取栈顶索引,然后从该索引所指的位置开始,朝索引值递减的方向依次尝试从相应元素出栈,当出栈失败的次数超过给定阈值P后,
会在本线程的运行状态中公布本次出栈请求;其它线程会在执行无等待出栈操作时,
尝试为该出栈请求指定合适的出栈位置,以协助该出栈请求的完成。
2.如权利要求1所述的方法,其特征在于,该线程thi执行无等待入栈操作的具体实现方法为:
a)对栈顶索引T进行原子加一,获取入栈位置索引i;设置变量push_failures,用于记录将入栈数据v存入全局数组失败的次数;
b)如果全局数组的当前长度小于i+1,则通过分配多个包含N个数组元素的段,将全局数组的长度扩展为不小于i+1;在全局数组中查找索引为i的元素,并将变量c设置为该元素,然后尝试将入栈数据v存入元素c的变量val;其中,索引为i的元素指全局数组中第i+1个元素;
c)判断入栈数据v是否被成功存入元素c的变量val,如果是,则结束本次入栈操作;否则,执行push_failures=push_failures+1;判断当前push_failures值是否大于阈值P,如果是,则该线程thi的运行状态中公布本次入栈请求r,并将入栈请求r的标识符设置为入栈位置索引i的当前值,执行步骤d);否则,执行步骤a);
d)对栈顶索引T进行原子加一,获取入栈位置索引i;如果全局数组的当前长度小于i+1,则通过分配多个包含N个数组元素的段,将全局数组的长度扩展为不小于i+1;在全局数组中查找索引为i的元素,并将变量c设置为该元素,如果能够将元素c的指向入栈请求的指针push改为指向该入栈请求r,则将元素c指定为该入栈请求r的入栈位置,否则判断该入栈请求r是否已有指定元素进行入栈,如果是,则将入栈数据v存入该入栈请求r被指定的入栈元素的val变量中,结束本次入栈操作;如果该入栈请求r没有指定元素进行入栈,则重复步骤d)。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于中国科学院信息工程研究所,未经中国科学院信息工程研究所许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201611186222.2/1.html,转载请声明来源钻瓜专利网。
- 上一篇:提扣
- 下一篇:包装箱(中老年黑牛奶)