Liam的操作系统学习历程(一):xv6 homework 9 Barriers

实验要求:

 

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

 

实验过程:(代码实现参考了https://blog.youkuaiyun.com/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,最后释放锁;如果不相等,则释放锁并进入睡眠状态,在被唤醒后再释放锁。

 

实验结果:

 

转载于:https://www.cnblogs.com/tju-liuchang/p/10906717.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值