首页 > 其他分享 >MIT 6.828 Homework: Thread and locking

MIT 6.828 Homework: Thread and locking

时间:2022-11-11 20:13:11浏览次数:48  
标签:Thread barrier locking nthread 屏障 线程 mutex MIT bstate

任务:修改代码以实现对于每一个循环,让每一个线程都暂时阻塞直到所有线程都调用了barier函数

实际上就是实现一个屏障,当线程运行到屏障之前,会被暂时挂起,直到所有线程都到达屏障之后才会继续运行

而在原始的代码中,由于 barriers 函数中没有进行处理,sleep 较短时间的线程必定会比另一线程更早离开 barrier,进入下一个循环,从而发生错误。

在 barrier 函数的编写过程中需要维护两个变量,bstate.nthread 和 bstate.round。

  • bstate.thread 指示已到达屏障的线程的数量,用于判断是否应阻塞线程
  • bstate.round 指示当前的循环的数目,用于测试是否有线程提前离开了屏障。

进入 barrier 后,在加锁的基础上,首先将bstate.nthread 加 1,代表到达屏障的线程有多了一个;接着比较bstate.nthread 和 nthread 判断是否所有线程都已经到达屏障,如果没有全部到达,阻塞当先线程,加入等待队列,如果全部到达,bstate.round加 1,bstate.nthread置为 0 供下一轮循环使用,唤醒等待队列中的所有线程。

最终的barrier.c函数如下:

static void 
barrier()
{
  pthread_mutex_lock(&bstate.barrier_mutex);
  bstate.nthread++;
  if(bstate.nthread == nthread)
  {
    bstate.round++;
    bstate.nthread = 0;
    pthread_cond_broadcast(&bstate.barrier_cond);
  }
  else
  {
    pthread_cond_wait(&bstate.barrier_cond, &bstate.barrier_mutex);
  }
  pthread_mutex_unlock(&bstate.barrier_mutex);
}

最终测试结果如下:

❯ ./a.out 4
OK; passed

标签:Thread,barrier,locking,nthread,屏障,线程,mutex,MIT,bstate
From: https://www.cnblogs.com/tea-in-the-snow/p/16881610.html

相关文章

  • 【HarmonyOS】【ArkUI】在Service中使用Emitter
    参考资料1.相关基础知识:​​触发器Emitter​​2.启动服务:ServiceAbility开发开发步骤第一步:开发界面,界面内容由一个按钮组件+文本组件构成,然后在按钮组件中添加点击事件,开......
  • 【HarmonyOS】【ArkUI】在Service中使用Emitter
    ​ 参考资料1.相关基础知识:触发器Emitter2.启动服务:ServiceAbility开发 开发步骤第一步:开发界面,界面内容由一个按钮组件+文本组件构成,然后在按钮组件中添加点击事件......
  • 20201317-Thread同步测试
    Thread同步测试代码#include<stdio.h>#include<pthread.h>#include<stdlib.h>#include<semaphore.h>#defineNUM5intqueue[NUM];sem_tblank_number,produ......
  • 线程池ExecutorService中submit 和execute的区别
    引言   ExecutorService线程池执行线程时有submit和execute两种方法,它们两者之间有什么区别了?可能平时我们只是运用,没有深究其区别,在此我们可以看看它们的区别? ......
  • 【Java】随机数原理 Random ThreadLocalRandom
    大致生成原理:随机数由seed经过一定的转换生成。需要提供初始seed。每一次生成随机数时,先由老seed生成新seed,再根据新seed生成新的随机数。由于算法是固定的,所以如果初始seed......
  • MIT 6.828 Homework: shell
    实验提供了一个shell的简化版本,主要功能是解析shell命令并且执行在提供的shell代码中已经编写好了对命令进行解析的部分,我们需要的是利用Unix系统调用对命令进行执行Exec......
  • ulimit命令优化linux进程连接数等…
    在Linux下面部署应用的时候,有时候会遇上Socket/File:Can’topensomanyfiles的问题,比如还有Squid做代理,当文件打开数到900多时速能就非常快的下降,有可能打不开网页.其......
  • Java多线程 ThreadPoolExecutor-RejectedExecutionHandler拒绝执行策略
    目录​​一、说明​​​​二、理解​​​​三、实现​​​​1.AbortPolicy​​​​2.DiscardPolicy​​​​3.DiscardOldestPolicy​​​​4.CallerRunsPolicy​​​​5.自......
  • MIT 6.828 Homework: Xv6 System Calls
    PartOne:Systemcalltracing任务:修改Xv6内核的代码来打印出每个系统调用以及返回值根据提示,应该在syscall.c中修改syscall()。首先在syscall.c中增加对应系统调用名......
  • MIT6.S081笔记:Lab Xv6 And Unix Utilities
    关于MIT6.S081这门课的前身是MIT著名的课程6.828,MIT的几位教授为了这门课曾专门开发了一个基于x86的教学用操作系统JOS,被众多名校作为自己的操统课程实验。但随......