操作系统实验五线程间的互斥与同步.pdfVIP

  • 132
  • 0
  • 约4.68千字
  • 约 6页
  • 2021-07-02 发布于上海
  • 举报

操作系统实验五线程间的互斥与同步.pdf

实验 五 线程间的互斥与同步 实验学时: 2 学时 实验类型:验证、设计型 一、实验目的 理解 POSIX 线程( Pthread)互斥锁和 POSIX 信号量机制,学 习它们的使用方法;编写程序,实现多个 POSIX 线程的同步控制。 二,实验内容 创建 4 个 POSIX线程。其中 2 个线程 (A 和 B)分别从 2 个数据文 件 (data1.txt 和 data2.txt) 读取 10个整数 . 线程 A 和 B把从文件中 读取的逐一整数放入一个缓冲池 . 缓冲池由 n 个缓冲区构成( n=5, 并可以方便地调整为其他值) ,每个缓冲区可以存放一个整数。另外 2 个线程, C 和 D,各从缓冲池读取 10 数据。线程 C、D 每读出 2 个 数据,分别求出它们的和或乘积,并打印输出。 提示:在创建 4 个线程当中, A 和 B 是生产者,负责从文件读取 数据到公共的缓冲区, C和 D是消费者,从缓冲区读取数据然后作不 同的计算 (加和乘运算)。使用互斥锁和信号量控制这些线程的同步。 不限制线程 C 和 D 从缓冲区得到的数据来自哪个文件。 在开始设计和实现之前,务必认真阅读课本 6.8.4 节和第 6 章后 面的编程项目——生产者 - 消费者问题。 三,实验要求 按照要求编写程序,放在相应的目录中,编译成功后执行,并按 照要求分析执行结果,并写出实验报告。 四,实验设计 1,功能设计 根据实验要求,主程序需要创建四个线程,两个线程负责从文件 读取数据到缓冲区, 两个线程负责将缓冲区的数据做数学运算。 由于 同一个进程中的各个线程共享资源, 可以用一个二维数组的全局变量 作为公共缓冲区, 同时还需要一个整形全局变量 size 用来做数组的索 引。读线程的运行函数打开不同的文件并从中读取数据到二维数组 中,每次写入数组后 size 加一。运算线程从二维数组中读数并做运算, 每次读数之前 size 减一。本题的关键在于如何使用信号量保证进程的 同步与互斥。 在运算线程从缓冲区读取之前缓冲区里必须有数, 即任 意时刻运算操作的执行次数必须小于等于读取操作的执行次数。 同时 应该保证两个读线程和两个运算线程两两互斥。 由于以上分析, 使用 了四个信号量 sem1,sem2,sem3 和 sem4。sem1保证线程 1 和线程 2 互斥, sem2 保证线程 3 和线程 4 互斥, sem3 保证线程 3 和线程 4 互斥, sem4 保证线程 4 和线程 1 互斥。即这四个信号量使四个线程 循环进行,从而保证了运行结果的正确性。 源代码及注释: #include stdio.h #include pthread.h #include semaphore.h #define NUM 200 int stack[NUM][2]; // 公共缓冲区 int size=0; //初始化数组索引 sem_t sem1,sem2,sem3,sem4; // 定义四个信号量 void read1(void){ // 线程运行函数,负责从文件读取数据 FILE *fp=fopen(data0.txt,r);

文档评论(0)

1亿VIP精品文档

相关文档