二维码
业务中心Business
关于我们
业务中心
联系我们
[field:typename/]
你现在的位置:主页 > 业务中心 > 进口业务 >
C语言边角料3:用纯软件来取代Mutex互斥锁-多线程
网络整理 [ 浏览点击:] [ 发布时间:2021-03-30 14:01 ]

C语言边角料3:用纯软件来代替Mutex互斥锁-多线程

一、媒介

二、Micha Hofri 算法

三、测试代码

四、总结

一、媒介

在上一篇文章中,先容了一种纯软件算法,用来实现临界区的掩护成果,文章链接: C语言边角料2:用纯软件来取代Mutex互斥锁

首先明晰一下:假如操作操纵系统提供的互斥锁可以实现我需要的成果,我必定利用互斥锁,之所以先容 Peterson 这个算法,主要是因为它较量有意思,很小巧,可觉得我们带来一些“类型的”编程之外的一些想法。

靠山也有一些小同伴对这个算法颁发了一些留言,只要有想法都很是好,就怕不去想。

个中有位伴侣提到,这个算法只能用在 2 个线程中,是否有其他的雷同算法,可以用在多线程中?

晚上下班后,我就花了点时间找到下面的这个算法,分享一下!

二、Micha Hofri 算法

这个算法我没有找到名字,暂且以作者的名字来称号这个算法吧!

算法截图:

C语言边角料3:用纯软件来代替Mutex互斥锁-多线程

从算法的主体代码看,Hofri 算法主要是扩展了 Peterson 算法,都是利用 2 个全局变量数组来节制哪个线程可以进入临界区。

这个算法的论证较量巨大,都是一些数学方面的证明,文章在这里:Proof of a Mutual Exclusion Algorithm-- A `Class'ic Example,龙八国际登录, 1989 年颁发,感乐趣的小同伴可以自行去烧脑研究。

三、测试代码

// 线程操纵的资源 

static int num = 0; 

 

// 建设 10 个线程 

#define THREAD_NUM      10 

 

// 这 2 个全局变量节制算法 

int flag[THREAD_NUM] = {0 }; 

int turn[THREAD_NUM - 1] = {0}; 

 

// 这是线程函数 

void *thread_routine(void *arg) 

    int index = *(int *)arg; 

 

    for (int i = 0; i < 10000; ++i) // 线程轮回次数 

    { 

        for (int j = 1; j < THREAD_NUM - 1; j++)  

        { 

            flag[index] = j; 

            turn[j] = index

    L: 

            for (int k = 1; k < THREAD_NUM; ++k) 

            { 

                if (k == indexcontinue

                if ((flag[k] >= j) && turn[j] == index

                    goto L; 

            } 

 

        } 

 

        flag[index] = THREAD_NUM; 

         

        // 要害代码段 

        num++; 

         

        flag[index] = 0; 

    } 

    return NULL

 

void test() 

    // 用来通报线程的索引 

    int index[THREAD_NUM] = {0}; 

     

    建设多个线程,执行同一个函数 

    pthread_t t[THREAD_NUM]; 

    for (int i = 0; i < THREAD_NUM; ++i) 

    { 

        index[i] = i; 

站点地图

Copyright © 2019 龙八国际工程塑料有限公司 All rights reserved