实验要求:
通过使用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,最后释放锁;如果不相等,则释放锁并进入睡眠状态,在被唤醒后再释放锁。
实验结果: