您的位置:首页 > 其它

信号量实现进程同步

2014-08-10 10:04 357 查看
#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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: