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,最后释放锁;如果不相等,则释放锁并进入睡眠状态,在被唤醒后再释放锁。

    实验结果:

  • 相关阅读:
    (原)Vs中debug和release结果不一致
    (原)mkl用到的函数
    JAVA JDBC 批量操作
    JAVA JDBC 操作blob数据
    JAVA JDBC 利用反射对一个表动态查询
    JAVA JDBC 查询数据
    JAVA JDBC 插入中文时声明utf8编码
    JAVA JDBC prepareStatement 添加数据
    JAVA JDBC 连接数据库
    unzip命令指定编码格式
  • 原文地址:https://www.cnblogs.com/tju-liuchang/p/10906717.html
Copyright © 2011-2022 走看看