zoukankan      html  css  js  c++  java
  • Liam的操作系统学习历程(一):xv6 homework 9 Barriers

    实验要求:

    通过使用pthread library提供的条件变量来实现一个Barrier。Barrier是应用中的一个节点,所有线程到达这一结点后必须停止等待,直到所有线程都已经到达这一节点后,再继续执行。

    实验过程:(代码实现参考了https://blog.csdn.net/whyymlm/article/details/53454039的代码)

    下载barrier.c文件,按照题目要求编译并运行后,得到结果如下:

    分析程序代码,main()函数代码如下:

    main()函数的主要功能为根据传入参数,创建对应个数的线程,并在成功运行后,输出通过的结果。

    再看一下每个线程所执行的内容:

    这里每个线程会进行20000循环,每轮循环会判断bstate中的轮数是否与本线程的当前轮数相同,如果不同就会报错。所以在多线程执行时,就需要在每个线程执行完同一轮后,在修改bstate中的round值。这就需要我们使用barrier的概念来实现。而程序中原有的barrier代码是直接对round进行加1操作,所以一定会出现round和本线程内的轮数不同的情况,我们需要做的就是修改barrier函数。修改内容如下:

    程序实现的思路为:因为是多线程访问,所以首先要对临界资源进行加锁保护,然后对bstate中的nthread进行加1操作,程序开始的结构体定义中说明了nthread的作用是标识当前round中到达barrier的线程数。所以之后判断bstate中的nthread与总的线程数nthread是否相等,如果相等,则唤醒其他睡眠等待的线程,将round值加1并重置nthread,最后释放锁;如果不相等,则释放锁并进入睡眠状态,在被唤醒后再释放锁。

    实验结果:

  • 相关阅读:
    动态传参
    函数的介绍
    文件的操作
    send email with formatted table
    minimize and close window with customed winform
    python algorithm
    something important about docker
    book list
    which language is suitable for what to do
    Find Duplicate Items in list fast
  • 原文地址:https://www.cnblogs.com/tju-liuchang/p/10906717.html
Copyright © 2011-2022 走看看