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

    实验结果:

  • 相关阅读:
    android源码在线查看
    关于codereview工具与建议
    <转>如何进行code review
    [转] Android实时抓包分析 : 善用adb调试桥
    Swift:UIKit中Demo(一)
    Objective-C学习笔记(十)——循环语句for和do-while的使用
    一些牛人的IOS博客,mark下慢慢学习
    Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力)
    Web前端之基础知识
    通过金矿模型介绍动态规划
  • 原文地址:https://www.cnblogs.com/tju-liuchang/p/10906717.html
Copyright © 2011-2022 走看看