关于MIT6.828_HW9_barriers xv6 homework9的一些问题
最近在学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的一些问题相关推荐
- MIT6.828_HW9_barriers
MIT6.828_HW9_barriers 在这个任务中,我们使用由pthread库提供的条件变量来实现barrier.barrier 是一个应用程序点,必须所有线程到达这个点才能继续执行.条件变量是 ...
- 2020 MIT6.s081 XV6操作系统调试
文章目录 环境准备 启动调试 调试步骤 gdb layout GDB调试常用命令 参考链接 友情链接:全部实验哟 环境准备 操作系统:本人采用的操作系统版本为Ubuntu 20.04.2 LTS # ...
- 浪潮之巅 “八叛徒”与硅谷
#第3章 "八叛徒"与硅谷 #博客导航 #Result #Evaluation #博客导航 这是本人的 CSDN 博客之分类专栏链接,欢迎点击阅读! M ...
- 「实验记录」MIT 6.S081 Lab7 multithreading
#Lab7: multithreading I. Source II. My Code III. Motivation IV. Uthread: switching between threads ( ...
- 操作系统MIT6.S081:[xv6参考手册第4章]->Trap与系统调用
本系列文章为MIT6.S081的学习笔记,包含了参考手册.课程.实验三部分的内容,前面的系列文章链接如下 操作系统MIT6.S081:[xv6参考手册第1章]->操作系统接口 操作系统MIT6. ...
- 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 ...
- MIT6.828学习之homework9:Barriers
在本作业中,我们将探讨如何使用pthread库提供的条件变量来实现barrier.barrier是应用程序中的一个点,在这个点上,所有线程都必须等待,直到所有其他线程也到达该点.条件变量是一种序列协调 ...
- MIT6.S081 2021
MIT6.S081 2021 环境配置 Xv6 and Unix utilities vscode格式化头文件排序问题 以地址空间的视角看待变量 其他 代码参考 system calls trace ...
- Mit6.S081学习记录
Mit6.S081学习记录 前言 一.课程简述 二.课程资源 1,课程主页 2,参考书 3,实验环境 三.学习过程 Mit6.S081-实验环境搭建 Mit6.S081-GDB使用 Mit6.S081 ...
最新文章
- gitlab中文_ASP.NET实战010:Visual Studio使用GitLab详解
- 36)PHP,搜寻数据库信息在html中显示(晋级1)
- python中的抽象含义_Python中下划线的5种含义你都知道吗?
- CIKM 2020 | 知识库问答复杂问题的分层查询图生成方法
- Spring事务TransactionProxyFactoryBean属性-transactionAttributes的意义
- 微信公招访问我服务器的那个端口,查看谁在使用某个网络端口
- C++:执行i++时,汇编是怎么操作的
- 教你轻松截获 Selenium 中的 Ajax 数据
- 详解 C++ 的隐式类型转换与函数重载!
- 不重启程序使用最新版package
- ❤️使用Spring注解开发(建议收藏)
- JAVA模拟学生选课系统(附下载链接)
- Win10更新后BUG——任务栏点不动、卡死、加载不出来解决办法
- 2021测试开发面试题大全及答案(包含测试基础|接口测试|自动化测试...)【289页】
- 知识图谱文献综述(第一章 知识表示与建模)
- python-认识(第五段-函数)
- 阿里云基础认证(ACA - Alibaba Cloud Certification Associate)
- 清北学堂2019.8.7
- 人死了以后往哪儿去了?
- 韩国国会表决通过中韩自贸协定批准案