用记录型信号量解决生产者-消费者问题

 1   int in = 0, out = 0;//in: 输入指针, out: 输出指针;
 2   item buffer[n];//n个缓冲区组成的数组;
 3   semaphore mutex = 1, full = 0, empty = n;
 4   //mutex: 互斥信号量, 生产者进程和消费者进程都只能互斥访问缓冲区;
 5   //full: 资源信号量, 满缓冲区的数量;
 6   //empty: 资源信号量, 空缓冲区的数量;//信号量不允许直接参与运算, 故都要定义;
 7
 8   //生产者程序;
 9   void Producer() {
10    do {
11        生产者生产一个产品nextp;
12        wait(empty);//申请一个空缓冲区;
13        wait(mutex);//申请临界资源;
14        buffer[in] = nextp;//将产品添加到缓冲区;
15        in = (in + 1) % n;//类似于循环队列;
16        signal(mutex);//释放临界资源;
17        signal(full);//释放一个满缓冲区;
18    } while (TRUE);
19  }
20
21  //消费者程序;
22  void Consumer() {
23    do {
24        wait(full);//申请一个满缓冲区;
25        wait(mutex);//申请临界资源;
26        nextc = buffer[out];//将产品从缓冲区取出;
27        out = (out + 1) % n;//类似于循环队列;
28        signal(mutex);//释放临界资源;
29        signal(empty);//释放一个空缓冲区;
30        消费者将一个产品nextc消费;
31   } while (TRUE);
32
33    void main(){
34      cobegin
35              Producer();
36              Consumer();
37      coend
38
39  }
40
41 }

原文地址:https://www.cnblogs.com/wangjiaolong/p/12129434.html

时间: 2024-10-07 06:58:03

用记录型信号量解决生产者-消费者问题的相关文章

用信号量解决生产者消费者问题

用信号量解决生产者消费者问题: ipc.h #ifndef _IPC_H_ #define _IPC_H_ #include <sys/types.h> #include <unistd.h> #include <sys/ipc.h> #include <sys/sem.h> #include <sys/shm.h> #include <errno.h> #include <stdio.h> #include <st

Linux下用环形buf以及POSIX版本信号量解决生产者消费者问题

一.Semaphore(信号量) Mutex变量是非0即1的,可看作一种资源的可用数量,初始化时Mutex是1,表示有一个可用资源, 加锁时获得该资源,将Mutex减到0,表示不再有可用资源,解锁时释放该资源,将Mutex重新加到1,表示又有了一个可用资源. 信号量(Semaphore)和Mutex类似,表示可用资源的数量,和Mutex不同的是这个数量可以大于1. 即,如果信号量描述的资源数目是1时,此时的信号量和互斥锁相同! 本次使用的是POSIX semaphore库函数,这种信号量不仅可以

整型信号量与记录型信号量

信号量机构是一种功能较强的机制,可用来解决互斥与同步的问题,它只能被两个标准的原语wait(S)和signal(S)来访问,也可以记为"P操作"和"V操作". 原语是指完成某种功能且不被分割不被中断执行的操作序列,通常可由硬件来实现完成不被分割执行特性的功能.如前述的"Test-and-Set"和"Swap"指令,就是由硬件实现的原子操作.原语功能的不被中断执行特性在单处理机时可由软件通过屏蔽中断方法实现. 原语之所以不能被中

珍藏好料开源放送: windows平台一个高性能、通用型的C++生产者/消费者架构模板

/* 生产者/消费者通用模板 特点: 高性能:采用多线程,多队列平衡的信号量等待模型,有效减少锁等待 可调节:可以根据实际应用环境调整队列数,最多可支持64个队列 使用简单,一个构造函数,一个生产函数,一个消费函数. */ #ifndef PANDC_H #define PANDC_H #include <vector> #include <deque> #include <Windows.h> #include <limits.h> using names

基于POSIX的信号量的生产者消费者模型

信号量和Mutex类似,表示可用资源的数量,和Mutex不同的是,这个数量可以大于1,即如果信号量描述的资源数目是1时,此时的信号量和互斥锁相同. 下面我们看看POSIX semaphore库函数,它既可以用于同一进程的线程间同步,也可以用于不同进程间的同步. 1. int sem_init(sem_t *sem,int pshared,unsigned int value) 我们可以用此函数来创建一个未命名的信号量,pshared参数表明是否在多个进程中使用信号量,如果是,将其设置为非0 值,

两种方式解决 生产者消费者问题

一.通过wait().notify()线程通信来实现 输出结果: 二.通过阻塞队列来解决生产者消费者问题 输出结果: 由输出结果可以看出:"最后阻塞队列中还剩下4个鸡蛋"明显是正确的,可知阻塞队列内部意见实现了同步,不需要我们额外同步,是线程安全的.

使用条件量解决生产者消费者问题

在linux多线程同步中,除了互斥量以外,pthread提供了另一种同步机制:条件变量.正如名字一样,条件量允许线程由于一些未达到的条件而阻塞. 条件变量与互斥量经常一起使用.这种模式用于让一个线程锁住一个变量,然后当它不能获得它期待的结果时等待一个条件变量.最后另一个线程会向他发出信号,使它可以继续执行.pthread_cond_wait原子性地调用并解锁它持有的互斥量.由于这个原因,互斥量是参数之一. 下面通过代码演示如何通过条件量来解决生产者消费者问题. #include<stdio.h>

java多线程解决生产者消费者问题

import java.util.ArrayList; import java.util.List; /** * Created by ccc on 16-4-27. */ public class Test { public static void main(String[] args) { GunClip clip = new GunClip(); Producer p = new Producer(clip); customer c = new customer(clip); p.star

【译】使用阻塞队列解决生产者-消费者问题

如果你想避免使用错综复杂的wait–notify的语句,BlockingQueue非常有用.BlockingQueue可用于解决生产者-消费者问题,如下代码示例.对于每个开发人员来说,生产者消费者问题已经非常熟悉了,这里我将不做详细描述. 为什么BlockingQueue适合解决生产者消费者问题 任何有效的生产者-消费者问题解决方案都是通过控制生产者put()方法(生产资源)和消费者take()方法(消费资源)的调用来实现的,一旦你实现了对方法的阻塞控制,那么你将解决该问题. Java通过Blo