信号量实现进程同步
2014-08-10 10:04
323 查看
#include<sys/mman.h> #include<sys/types.h> #include<linux/sem.h> #include<fcntl.h> #include<unistd.h> #include<stdio.h> #include<errno.h> #include<time.h> #define MAXSEM 5 /*声明三个信号量ID*/ int fullid; int emptyid; int mutxid; int main(){ struct sembuf P,V; union semun arg; /* 声明共享主存*/ int *array; int *sum; int *set; int *get; /*将array、sum、set、get映射到共享主存*/ array=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int)*MAXSEM,IPC_CREAT|0666),0,0); sum=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0); set=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0); get=(int *)shmat(shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666),0,0); *get=0; /*创建信号量fullid、emptyid和mutxid*/ fullid=semget(IPC_PRIVATE,0666|IPC_CREAT); emptyid=semget(IPC_PRIVATE,0666|IPC_CREAT); mutxid=semget(IPC_PRIVATE,0666|IPC_CREAT); /*为信号量赋值*/ arg.val=0; if(semctl(fullid,0,SETVAL,arg)==-1) perror("semctl setval error"); arg.val=MAXSEM; if(semctl(emptyid,0,SETVAL,arg)==-1) perror("semctl setval error"); arg.val=1; if(semctl(mutxid,0,SETVAL,arg)==-1) perror("semctl setval error"); /*初始化PV*/ P.sem_num=0; P.sem_op=-1; P.sem_flg=SEM_UNDO; V.sem_num=0; V.sem_op=1; V.sem_flg=SEM_UNDO; /*创建生产者进程*/ if(fork()==0){ int i=0; *set=0; while(i<100){ semop(emptyid,&P,1); semop(mutxid,&P,1);//对emptyid、mutxid执行P操作 array[(*set)%MAXSEM]=i+1; (*set)++; semop(mutxid,&V,1); //对emptyid、mutxid执行V操作 semop(fullid,&V,1); // i++; } sleep(3); printf("生产者结束\n"); exit(0); }else{ /*创建消费者进程*/ if(fork()==0){ while(1){ semop(fullid,&P,1); //对emptyid、mutxid执行P操作 semop(mutxid,&P,1); // if(*get==100) break; *sum+=array[(*get)%MAXSEM]; printf("The ConmsumerA Get Number %d\n",array[(*get)%MAXSEM]); (*get)++; if(get==100) printf("The sum is %d\n",sum); semop(mutxid,&V,1); semop(emptyid,&V,1); sleep(1); } printf("消费者结束\n"); exit(0); }else{ /*创建消费者进程B*/ if(fork()==0){ while(1){ semop(fullid,&P,1); //对emptyid、mutxid执行P操作 semop(mutxid,&P,1); if(*get==100) break; *sum+=array[(*get)%MAXSEM]; printf("The ConmsumerB Get Number %d\n",array[(*get)%MAXSEM]); (*get)++; if(get==100) printf("The sum is %d\n",sum); semop(mutxid,&V,1); semop(emptyid,&V,1); sleep(1); } printf("消费者B结束!\n"); exit(0); } } } }
本文出自 “阿凡达” 博客,请务必保留此出处http://shamrock.blog.51cto.com/2079212/724992
相关文章推荐
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- 进程间共享内存(信号量实现同步)
- Linux下通过共享内存进行进程间通信,进程间同步使用信号量来实现
- 共享内存多进程间通信,进程间同步使用信号量来实现
- 线程同步3 ------ 信号量实现进程或者线程之间的同步
- Posex信号量 实现进程间的同步(生产者&消费者)
- 使用共享实现两个进程之间的聊天-使用有名信号量实现同步
- Linux下信号量实现进程同步、互斥(生产者消费者问题)
- 信号量实现进程同步
- 共享内存多进程间通信,进程间同步使用信号量来实现
- 进程间共享内存(信号量实现同步)
- 信号量实现进程同步
- 信号量实现多进程的同步访问
- linux 命名信号量实现进程间的互斥与同步
- linux多线程【8】mmap实现父子进程的共享内存通信,用信号量同步
- 18.进程同步与死锁——信号量的代码实现
- 无名信号量实现相关进程同步
- 用system V信号量实现进程同步的例子
- 使用信号signal,实现进程之间的同步
- 进程间同步与互斥---信号量P,V操作