当前位置: 首页 > 科技观察

C语言花絮3:用纯软件替代Mutex互斥锁-多线程

时间:2023-03-19 17:14:04 科技观察

1.前言2.MichaHofri算法3.测试代码4.总结1.前言在上一篇文章中,一个纯软件算法用于实现临界区保护功能,文章链接:C语言剩菜2:用纯软件替换Mutex互斥锁。首先明确一点:如果操作系统提供的mutex能够实现我需要的功能,我一定会使用mutex。之所以介绍Peterson算法,是因为它比较有趣,体积小,可以给我们带来一些“正常”编程之外的一些思考。一些后台小伙伴也对这个算法发表了一些评论。只要有想法就很好,怕是想不出来。我的一个朋友提到这个算法只能在2个线程中使用。有没有其他类似的算法可以在多线程中使用?晚上下班,花了点时间找到了下面这个算法,分享一下。!2.MichaHofriAlgorithm这个算法的名字我没有找到,暂且以作者的名字来称呼这个算法吧!算法截图:从算法的主要代码来看,Hofri算法主要是对Peterson算法的扩展,都使用2个全局变量数组来控制哪些线程可以进入临界区。这个算法的证明比较复杂,都是数学证明。文章在这里:ProofofaMutualExclusionAlgorithm--A`Classic'icExample,发表于1989年,有兴趣的朋友可以自己烧脑研究一下。3.测试代码//线程操作资源staticintnum=0;//创建10个线程#defineTHREAD_NUM10//这2个全局变量控制算法intflag[THREAD_NUM]={0};intturn[THREAD_NUM-1]={0};//这是线程函数void*thread_routine(void*arg){intindex=*(int*)arg;for(inti=0;i<10000;++i)//线程循环次数{for(intj=1;j=j)&&turn[j]==index)gotoL;}}flag[index]=THREAD_NUM;//关键代码段num++;flag[index]=0;}returnNULL;}voidtest(){//用于传递线程的索引intindex[THREAD_NUM]={0};创建多个线程并执行同一个函数);}}编译执行,所有线程执行后共享资源num变量可以得到正确的结果。4.总结让我重复一下我在文章开头所说的话。这里的算法只是说明可以完成保护临界区的功能,但是在实际项目中,真的不推荐这么用。毕竟代码的可维护性很重要!本文转载自微信公众号“IOT物联网小镇”,可通过以下二维码关注。转载本文请联系物联小镇公众号。