实验二 进程(线程)同步

  • 实验目的

掌握Linux环境下,进程(线程)同步以及临界资源的互斥访问方法。

  • 实验要求

熟悉Linux操作系统线程创建、利用信号量机制进行同步和互斥访问临界资源。

  • 实验内容

本实验包含生产者和消费者之间的同步以及读者和写者之间的同步两部分,请实现以下功能:

  1. 有多个生产者和多个消费者线程。我们使用含有n个元素的数组表示n个缓冲区。生产者线程每间隔一段时间例如一秒钟生产一个产品并放入缓冲区中。消费者线程等待生产者线程放入产品后在缓冲区中取出产品。请使用信号量机制实现生产者线程和消费者线程之间的同步。
  2. 有一个或多个写者线程和多个读者线程。读者和写者之间共享一缓冲区(缓冲区可用字符数组表示),写者获得缓冲区访问权限后往缓冲区写入内容。读者获得缓冲区访问权限后从缓冲区中读出内容。当有一个读者获得缓冲区访问权限后,其它读者线程可以访问该缓冲区。而读者与写者之间需要互斥的访问缓冲区。
  • Linux线程创建和信号量相关函数简介
  1. Linux线程创建简介

相关函数及头文件:

#include <pthread.h>

int pthread_create(pthread_t *thread, const pthread_attr_t *attr,

void *(*start_routine) (void *), void *arg);

pthread_create是Linux系统中创建线程的函数。它的功能是创建以第三个参数start_routine为入口函数的线程。

线程的入口函数须以void *为返回值和参数。

第一个参数为指向线程标识符的指针。第二个参数用来设置线程属性。第三个参数是线程运行函数的起始地址。最后一个参数是传入到运行函数的参数。

  1. Linux信号量相关函数

相关函数及头文件:

#include <semaphore.h>

int sem_init(sem_t *sem, int pshared, unsigned int value);

int sem_post(sem_t *sem);

int sem_wait(sem_t *sem);

Linux系统中使用sem_t变量表示信号量。sem_init函数是Linux中初始化信号量的函数,它的第一个参数sem用来传入需要初始化的信号量地址,第二个参数pshared值是用来表示该信号量是由进程内线程共享还是由进程之间共享,如果它的值设为0,那么该信号量将被进程内的线程共享(本实验所有线程都属于同一进程,故pshared的值设置为0即可)。第三个参数value用来设置信号量的整型初值,该值含义与操作系统理论课所学的信号量一致。

sem_post函数相当于操作系统中所学的信号量操作中signal操作,即对信号量中的整型值进行加1。sem_wait函数相当于操作系统中所学的信号量操作中的wait操作,即对信号量中的整型值进行减1,同时如果信号量的值减一之后小于0,调用该函数的线程阻塞直到其它线程执行sem_post(signal)操作。

以下为生产者消费者的代码,共包含mainProg.c、ProducerConsumerUtilities.h、ProducerConsumerUtilities.c、Consumer.c、Consumer.h、Producer.h和Producer.c七个源文件,请根据代码编写Makefile(注意这里使用了线程创建函数,故需要在Makefile文件中CFLAGS变量中加入-lpthread,即CFLAGS = -g -Wal

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值