实验原理:
在同一个进程地址空间内执行两个线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。当生产者线程生产物品时,如果没有空缓冲区可用,那么生产者线程必须等待消费者线程释放一个空缓冲区。当消费者线程消费物品时,如果没有满的缓冲区,那么消费者线程将被阻挡,直到新的物品被生产出来
首先创建信号量和创建子线程,
创建子线程是通过主线程和子线程分别来实现生产者和消费者,信号量是为了实现同步和互斥问题,问题的是指是P、V操作,实验设一个共享缓冲区,生产者和消费者互斥的使用,当一个线程使用缓冲区的时候,另一个让其等待直到前一个线程释放缓冲区为止。
创建两个全局变量的学号量,用于线程间的使用还有buf数组作为缓存区
一个信号量可能被初始化为一个非负整数.,semWait 操作(P操作)使信号量减1。若值为负,则执行 semWait的进程被阻塞。否则进程继续执行。semSignal操作(V操作)使信号量加1。若值小于或等于零, 则被semWait作阻塞的进程被解除阻塞
生产者:用srand()函数产生随机数向缓冲区buf数组赋值。
消费者:
通过有名管道实现进程间传输文件
有名管道(可以在任意两个进程之间通信)
有名管道、FIFO文件。
命名管道(FIFO)不同于无名管道之处在于它提供了一个路径名与之关联,以 FIFO 的文件形式存在于文件系统中,这样,即使与 FIFO 的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过 FIFO 相互通信,因此,通过 FIFO 不相关的进程也能交换数据。
读文件写管道
读管道写文件
打开管道文件以及想要传入数据的文件,把管道文件中的数据读出到定义的缓冲区再由缓冲区写入打开的文件。