Linux信号量之生产者与消费者

标签: Linux 信号量 同步与互斥 进程间通讯
2619人阅读 评论(0) 收藏 举报
分类:

设计一个程序,程序中有一个生产者进程两个消费者进程。生产者产生1~20的20个数。两个消费者从共享内存中取数。

首先分析题目
生产者和消费者之间存在着协同关系。而两个消费者要满足互斥。所以我们需要三个信号量,两个用来控制协同,一个用来控制消费者彼此之间的互斥。


包含头文件并定义所需全局变量:
#include <iostream>
#include <sys/types.h>
#include <sys/sem.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/mman.h>
#include <errno.h>
#include <time.h>
#include<unistd.h>
using namespace std;
        struct sembuf P,V;
        union senum{
            int val;
            struct semid_ds *buf; 
           unsigned short *array;
        }arc;

封装函数:
void sem_init()//初始化信号量的运行环境
{
P.sem_num= 0;
P.sem_op =-1;//信号量在操作时-1
P.sem_flg=SEM_UNDO;
V.sem_num= 0;
V.sem_op =1;//信号量在操作时+1
V.sem_flg=SEM_UNDO;
cout<<"Semaphore Initiate Successfully"<<endl;
}

void v(int sem_id)//v操作
{
    semop(sem_id,&V,1);
}
void p(int sem_id)//p操作
{
    semop(sem_id,&P,1);
}
void sem_crea(int &sem_id,int val)//用val来给信号量赋初值
{
    sem_id=semget(IPC_PRIVATE,1,IPC_CREAT|00666);
    arc.val=val;
    semctl(sem_id,0,SETVAL,arc);
}

主函数:
int main()
{
 sem_init();
 int mutx;
 int full;
 int empt;
 char *shares;
 int *num;
 int shareid;
 shareid=shmget(5,1280,0777|IPC_CREAT);//用同一个key可以得到同一块共享内存
 shares=(char*)shmat(shareid,0,0);//得到共享内存的指针
 sem_crea(mutx,1);
 sem_crea(full,0);
 sem_crea(empt,1);
 num=(int *)shares;
 pid_t p1;
 pid_t p2;
 p1=fork();//fork在子进程中返回0在父进程中返回子进程的pid_t
 p2=fork();
 if(p1==0)//生产者进程
 {
 int n=20;
 while(n--)
 {
 p(empt);
 *num=n;
 v(full);
 }
 sleep(5);
exec(0);
 }
 else if(p2==0)//两个消费者进程
 {
 while(1)
 {
 p(full);
 p(mutx);
 cout<<"comsumer A :"<<*num<<endl;
  v(mutx);
 v(empt);
 }
 }
 else
 {
 while(1)
 {
 p(full);
 p(mutx);
 cout<<"comsumer B :"<<*num<<endl;
 v(mutx);
 v(empt);
 }
 }
 return 0;
}


查看评论

Linux多线程编程(三)-----生产者与消费者(条件变量,信号量)

Linux多线程编程(一):http://blog.csdn.net/llzk_/article/details/55670172 Linux多线程编程(二):http://blog.csdn.ne...
  • LLZK_
  • LLZK_
  • 2017-02-22 21:02:27
  • 2015

Linux下信号量实现进程同步、互斥(生产者消费者问题)

linux的进程同步互斥实现生产者和消费者
  • Vista_feat
  • Vista_feat
  • 2016-10-27 15:59:07
  • 1817

【Linux】生产者消费者编程实现-线程池+信号量

生产者消费者编程实现,采用了线程池以及信号量技术。 线程的概念就不多说,首先说一下多线程的好处:多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,...
  • xiajun07061225
  • xiajun07061225
  • 2013-09-22 09:38:53
  • 8615

linux c 生产者与消费者问题 信号量(sem_t)

参考:“深入理解计算机系统” 第670页 信号量: 信号量提供两种特殊得操作P(s)与V(s)。 P(s):如果s为非零,P将s减一,然后立即返回。如果s为零,那么就挂起线程,直到s变为非零,而...
  • sumkee911
  • sumkee911
  • 2015-12-16 21:06:05
  • 2508

OS: 生产者消费者问题(多进程+共享内存+信号量)

一. 引子 时隔一年再次用到 cout 的时候,哥潸然泪下,这是一种久别重逢的感动,虽然基本忘光了。趁着有大把时间,再把生产者消费者问题巩固一下,用纯C吧。珍惜能写代码的幸福时光。 二. ...
  • yaozhiyi
  • yaozhiyi
  • 2012-05-13 14:46:15
  • 11895

生产者消费者问题(Linux多线程下两种实现)

生产者消费者问题是同步问题中的一种常见情况,节
  • u011056004
  • u011056004
  • 2014-08-01 10:16:22
  • 3384

信号量(生产者和消费者模型)

信号量和管程都是操作系统用于同步提供的两种方法,我们将结合生产者与消费者模型对此进行学习。什么是信号量?为了提高系统的并发性,我们引入了多进程,多线程,但是这样子带来了资源竞争,也就是多个程序同时访问...
  • xy913741894
  • xy913741894
  • 2017-04-30 20:08:15
  • 746

linux中的生产者和消费者问题--信号量 互斥 同步

互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有...
  • yusiguyuan
  • yusiguyuan
  • 2013-11-05 16:23:18
  • 3858

信号量与生产者消费者问题

生产者—消费者问题 生产者—消费者题型在各类考试(考研、程序员证书、程序员面试笔试、期末考试)很常见,原因之一是生产者—消费者题型在实际的并发程序(多进程、多线程)设计中很常见;之二是这种题型综合性...
  • fuzhongmin05
  • fuzhongmin05
  • 2017-01-19 15:06:44
  • 4077

信号量实现生产者消费者问题 window linux

1. 在Windows操作系统上,利用Win32API提供的信号量机制,编写应用程序实现生产者——消费者问题。 2. 在Linux操作系统上,利用Pthread API提供的信号量机制,编写应用程序...
  • u011676589
  • u011676589
  • 2013-09-14 08:49:58
  • 3425
    个人资料
    持之以恒
    等级:
    访问量: 3万+
    积分: 676
    排名: 7万+
    文章存档
    最新评论