博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
共享内存+信号量 实例
阅读量:4148 次
发布时间:2019-05-25

本文共 2616 字,大约阅读时间需要 8 分钟。

  1.   #include<sys/types.h>  
  2. #include<linux/sem.h>  
  3. #include<linux/shm.h>  
  4. #include<unistd.h>  
  5. #include<stdio.h>  
  6. #include<errno.h>  
  7. #include<time.h>  
  8. #define MAXSHM 5  //定义缓冲区数组的下标变量个数  
  9.   
  10. /*        定义3个信号量的内部标识  */  
  11. int fullid;  
  12. int emptyid;  
  13. int mutexid;  
  14.   
  15. /* 主函数  */  
  16. int main()  
  17. {  
  18. /*  定义2个共享内存的ID  */  
  19. int arrayid;  
  20. int getid;  
  21.   
  22. /*  定义共享内存虚拟地址  */  
  23. int *array;  
  24. int *get;  
  25.   
  26. /* 创建共享内存  */  
  27. arrayid=shmget(IPC_PRIVATE,sizeof(int) *MAXSHN,IPC_CREAT|0666);  
  28. getid=shmget(IPC_PRIVATE,sizeof(int),IPC_CREAT|0666);  
  29.   
  30. /*  初始化共享内存  */  
  31. array=(int *) shmat(arrayid,0,0);  
  32. get=(int *) shmat(getid,0,0);  
  33. *get=0;  
  34.   
  35. /* 定义信号量数据结构 */  
  36. struct sembuf  P,V;  
  37. union semun arg;  
  38.   
  39. /* 创建信号量  */  
  40. fullid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);  
  41. emptyid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);  
  42. mutexid=semget(IPC_PRIVATE,1,IPC_CREAT|0666);  
  43.   
  44. /*初始化信号量 */  
  45. arg.val=0;            //初始时缓冲区中无数据  
  46. if(semctl(fullid,0,SETVAL,arg)==-1)  
  47. perror(“semctl setval error”);  
  48. arg.val=MAXSHM;       //初始时缓冲区中有5个空闲的数组元素  
  49. if(semctl(emptyid,0,SETVAL,arg)==-1)  
  50. perror(“semctl setval error”);  
  51. arg.val=1;            //初始时互斥信号为1,允许一个进程进入  
  52. if(semctl(mutexid,0,SETVAL,arg)==-1)  
  53. perror(“semctl setval error”);  
  54.   
  55. /* 初始化 P  V操作  */  
  56. P.sem_num=0;  
  57. P.sem_op=-1;  
  58. P.sem_flg=SEM_UNDO;  
  59. V.sem_num=0;  
  60. V.sem_op=1;  
  61. V.sem_flg=SEM_UNDO;  
  62.   
  63. /*   生产者进程  */  
  64. if(fork()==0)  
  65. {  
  66. int i=0;  
  67. int set=0;  
  68. while(i<10)  
  69. {  
  70. semop(emptyid,&P,1);         //对 emptyid执行P操作  
  71. semop(mutexid,&P,1);         //对 mutexid执行 P操作  
  72. array[set%MAXSHM]=i+1;  
  73. printf(“Producer put number %d to No.%d\n”,array[set%MAXSHM],set%MAXSHM);  
  74. set++;                       //写计数加1  
  75. semop(mutexid,&V,1);         //对mutexid执行 V 操作  
  76. semop(fullid,&V,1);          //对fullid执行 V 操作  
  77. i++;  
  78. }  
  79.   
  80. sleep(3);                    //SLEEP 3秒,等待消费者进程执行完毕  
  81. printf(“Poducer if over\n”);  
  82. exit(0);  
  83. }  
  84. else  
  85. {  
  86. /*  消费者A进程  */  
  87. if(fork()==0)  
  88. {  
  89. while(1)  
  90. {  
  91. if(*get==10)  
  92. break;  
  93.   
  94. semop(fullid,&P,1);        //对fullid执行 P 操作  
  95.   semop(mutexid,&P,1);       //对mutexid执行 P 操作  
  96. printf(“The ConsumerA get number from No.%d\n”,(*get)%MAXSHM);  
  97. (*get)++;                   //读计数加1  
  98. semop(mutexid,&V,1);        //对mutexid执行 V 操作  
  99. semop(emptyid,&V,1);        //对fullid执行 V 操作  
  100. sleep(1);  
  101. }  
  102. printf(“ConsunerA is over\n”);  
  103. exit(0);  
  104. }  
  105. else  
  106. {  
  107. /*消费者B进程  */  
  108. if(fork()==0)  
  109. {  
  110. while(1)  
  111. {  
  112. if(*get==10)  
  113. break;  
  114. semop(fullid,&P,1);       //对fullid执行 P 操作  
  115. semop(mutexid,&P,1);      //对mutexid执行 P 操作  
  116. printf(“The ConsumerA get number from No.%d\n”,(*get)%MAXSHM);  
  117. (*get)++;                 //读计数加1  
  118. semop(mutexid,&V,1);      //对mutexid执行 V 操作  
  119. semop(emptyid,&V,1);      //对emptyid执行 V 操作  
  120. sleep(1);  
  121. }  
  122. printf(“ConsunerB is over\n”);  
  123. exit(0);  
  124. }  
  125. }  
  126. }  
  127.   
  128. /*   父进程返回后回收3个子进程  */  
  129. wait(0);  
  130. wait(0);  
  131. wait(0);  
  132. /*  断开并撤消2个共享内存  */  
  133. shmdt(array);  
  134. shmctl(arrayid,IPC_RMID,0);  
  135. shmctl(get);  
  136. shmctl(getid,IPC_RMID,0);  
  137.   
  138. /*   撤消3个信号量集  */  
  139. semctl(emptyid,IPC_RMID,0);  
  140. semctl(fullid,IPC_RMID,0);  
  141. semctl(mutexid,IPC_RMID,0);  
  142. exit(0);  
  143. }  
信号量的应用场景:一个生产者,多个消费者的情况。生产者线程的处理结果只能被N个消费者使用,信号量的值设置为N,当N个消费者占用时,其他消费者只能等待。

转载地址:http://ttiti.baihongyu.com/

你可能感兴趣的文章
XML生成(三):JDOM生成
查看>>
Ubuntu Could not open lock file /var/lib/dpkg/lock - open (13:Permission denied)
查看>>
collect2: ld returned 1 exit status
查看>>
C#入门
查看>>
C#中ColorDialog需点两次确定才会退出的问题
查看>>
数据库
查看>>
nginx反代 499 502 bad gateway 和timeout
查看>>
linux虚拟机安装tar.gz版jdk步骤详解
查看>>
python实现100以内自然数之和,偶数之和
查看>>
python数字逆序输出及多个print输出在同一行
查看>>
苏宁产品经理面经
查看>>
百度产品经理群面
查看>>
去哪儿一面+平安科技二面+hr面+贝贝一面+二面产品面经
查看>>
pytorch
查看>>
pytorch(三)
查看>>
ubuntu相关
查看>>
C++ 调用json
查看>>
nano中设置脚本开机自启动
查看>>
动态库调动态库
查看>>
Kubernetes集群搭建之CNI-Flanneld部署篇
查看>>