最近在学MIT6.828,做了HomeWork9:barriers。
大意就是实现一个线程屏障,多个线程都会调用barrier()函数,然后要求所有的线程都进入此barrier函数后才能依次离开barrier。
我的实现是这样的:

/*nthread为总的线程个数,bstate.nthread是初值为0的一个计数器*/
static void barrier()
{#define wait() pthread_cond_wait(&bstate.barrier_cond, &bstate.barrier_mutex)
#define notify() pthread_cond_broadcast(&bstate.barrier_cond)static int resume = 0; // 表示wait1,wait2的状态pthread_mutex_lock(&bstate.barrier_mutex);++bstate.nthread; //  safenotify();while (bstate.nthread < nthread && !resume)wait(); // wait1resume = 1; // 避免有线程执行--bstate.nthread破坏了已触发的wait1的条件,--bstate.nthread;if (bstate.nthread == 0)bstate.round++;notify();while (bstate.nthread > 0 && resume)wait(); // wait2resume = 0; // 避免有线程执行++bstate.nthread破坏了已触发的wait2的条件,pthread_mutex_unlock(&bstate.barrier_mutex);#undef wait
#undef notify
}

但是当我尝试在网上搜索标准答案时,清一色的实现是这样的:

static void barrier()
{pthread_mutex_lock(&bstate.barrier_mutex);bstate.nthread++;if (bstate.nthread == nthread){// 最后一个进程进入 执行 round++, 再唤醒其他进程。bstate.round++;bstate.nthread = 0;// 唤醒其他进程pthread_cond_broadcast(&bstate.barrier_cond); // BBB}else{   // 不存在假唤醒问题吗?pthread_cond_wait(&bstate.barrier_cond, &bstate.barrier_mutex); // AAA}pthread_mutex_unlock(&bstate.barrier_mutex);
}

经过不充分测试,两种实现都能正常运行。
但是,我觉得网上的实现存在假唤醒风险(小白拙见,如有误解请指出):

  • 正常情况下,如果一共是4个线程,那么当前三个线程进入后,他们都会被堵塞在AAA语句中,直到第四个线程进入后执行了BBB语句,前3个线程都会从wait中醒来,然后依次获取锁解锁再退出barrier()
  • 但是,如果前三个线程堵塞在AAA后,线程4还没有进入barrier()函数,然后此时发生了操作系统层面的假唤醒,导致前3个线程从wait中返回,这时它们就会直接退出barrier(),这就违反了屏障的定义。

希望有高人指点。

关于MIT6.828_HW9_barriers xv6 homework9的一些问题相关推荐

  1. MIT6.828_HW9_barriers

    MIT6.828_HW9_barriers 在这个任务中,我们使用由pthread库提供的条件变量来实现barrier.barrier 是一个应用程序点,必须所有线程到达这个点才能继续执行.条件变量是 ...

  2. 2020 MIT6.s081 XV6操作系统调试

    文章目录 环境准备 启动调试 调试步骤 gdb layout GDB调试常用命令 参考链接 友情链接:全部实验哟 环境准备 操作系统:本人采用的操作系统版本为Ubuntu 20.04.2 LTS # ...

  3. 浪潮之巅 “八叛徒”与硅谷

    #第3章 "八叛徒"与硅谷​​​​​​​​​​​​​​ #博客导航 #Result #Evaluation #博客导航 这是本人的 CSDN 博客之分类专栏链接,欢迎点击阅读! M ...

  4. 「实验记录」MIT 6.S081 Lab7 multithreading

    #Lab7: multithreading I. Source II. My Code III. Motivation IV. Uthread: switching between threads ( ...

  5. 操作系统MIT6.S081:[xv6参考手册第4章]->Trap与系统调用

    本系列文章为MIT6.S081的学习笔记,包含了参考手册.课程.实验三部分的内容,前面的系列文章链接如下 操作系统MIT6.S081:[xv6参考手册第1章]->操作系统接口 操作系统MIT6. ...

  6. MIT6.S081 2021 Copy-on-Write Fork for xv6

    MIT6.S081 2021 Copy-on-Write Fork for xv6 简要介绍 debug 代码参考 简要介绍 There is a saying in computer systems ...

  7. MIT6.828学习之homework9:Barriers

    在本作业中,我们将探讨如何使用pthread库提供的条件变量来实现barrier.barrier是应用程序中的一个点,在这个点上,所有线程都必须等待,直到所有其他线程也到达该点.条件变量是一种序列协调 ...

  8. MIT6.S081 2021

    MIT6.S081 2021 环境配置 Xv6 and Unix utilities vscode格式化头文件排序问题 以地址空间的视角看待变量 其他 代码参考 system calls trace ...

  9. Mit6.S081学习记录

    Mit6.S081学习记录 前言 一.课程简述 二.课程资源 1,课程主页 2,参考书 3,实验环境 三.学习过程 Mit6.S081-实验环境搭建 Mit6.S081-GDB使用 Mit6.S081 ...

最新文章

  1. gitlab中文_ASP.NET实战010:Visual Studio使用GitLab详解
  2. 36)PHP,搜寻数据库信息在html中显示(晋级1)
  3. python中的抽象含义_Python中下划线的5种含义你都知道吗?
  4. CIKM 2020 | 知识库问答复杂问题的分层查询图生成方法
  5. Spring事务TransactionProxyFactoryBean属性-transactionAttributes的意义
  6. 微信公招访问我服务器的那个端口,查看谁在使用某个网络端口
  7. C++:执行i++时,汇编是怎么操作的
  8. 教你轻松截获 Selenium 中的 Ajax 数据
  9. 详解 C++ 的隐式类型转换与函数重载!
  10. 不重启程序使用最新版package
  11. ❤️使用Spring注解开发(建议收藏)
  12. JAVA模拟学生选课系统(附下载链接)
  13. Win10更新后BUG——任务栏点不动、卡死、加载不出来解决办法
  14. 2021测试开发面试题大全及答案(包含测试基础|接口测试|自动化测试...)【289页】
  15. 知识图谱文献综述(第一章 知识表示与建模)
  16. python-认识(第五段-函数)
  17. 阿里云基础认证(ACA - Alibaba Cloud Certification Associate)
  18. 清北学堂2019.8.7
  19. 人死了以后往哪儿去了?
  20. 韩国国会表决通过中韩自贸协定批准案

热门文章

  1. 红米airdots掉了怎么查找_百元性价比之选,众筹只需79元的红米airdots2首发体验...
  2. Win7完全卸载MySQL的步骤
  3. Android Wi-Fi 修改国家码(QCOM平台)
  4. 如何在 Ubuntu 20.04 上安装 Wine 6.0
  5. Python实现布林带策略
  6. QQ群无故消失或QQ群无故被解散
  7. 云ERP与传统ERP系统的区别详解
  8. App广告投放数据统计
  9. 马云:大数据时代_最重要的是做最好的自己
  10. win10升级Java版本