实验要求:多线程
经过使用pthread library提供的条件变量来实现一个Barrier。Barrier是应用中的一个节点,全部线程到达这一结点后必须中止等待,直到全部线程都已经到达这一节点后,再继续执行。函数
实验过程:(代码实现参考了https://blog.csdn.net/whyymlm/article/details/53454039的代码)spa
下载barrier.c文件,按照题目要求编译并运行后,获得结果以下:.net
分析程序代码,main()函数代码以下:线程
main()函数的主要功能为根据传入参数,建立对应个数的线程,并在成功运行后,输出经过的结果。blog
再看一下每一个线程所执行的内容:资源
这里每一个线程会进行20000循环,每轮循环会判断bstate中的轮数是否与本线程的当前轮数相同,若是不一样就会报错。因此在多线程执行时,就须要在每一个线程执行完同一轮后,在修改bstate中的round值。这就须要咱们使用barrier的概念来实现。而程序中原有的barrier代码是直接对round进行加1操做,因此必定会出现round和本线程内的轮数不一样的状况,咱们须要作的就是修改barrier函数。修改内容以下:编译
程序实现的思路为:由于是多线程访问,因此首先要对临界资源进行加锁保护,而后对bstate中的nthread进行加1操做,程序开始的结构体定义中说明了nthread的做用是标识当前round中到达barrier的线程数。因此以后判断bstate中的nthread与总的线程数nthread是否相等,若是相等,则唤醒其余睡眠等待的线程,将round值加1并重置nthread,最后释放锁;若是不相等,则释放锁并进入睡眠状态,在被唤醒后再释放锁。thread
实验结果:变量