linux实现消费者生产者进程同步,就是生产者生产一个,消费者消费一个。在已有代码上修改。 20

生产者代码(producer.c):#include<unistd.h>#include<sys/types.h>#include<sys/ipc.h>#include<... 生产者代码(producer.c):
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <errno.h>
#define EXIT_FAILURE -1
#define EXIT_SUCCESS -1
#define SHMSZ 100
#define PATH "/tmp"
int main(void)
{
key_t key;
intshmid;
void *shm;
char *s,c;
key=ftok(PATH,'a');
if((shmid=shmget(key,SHMSZ,IPC_CREAT|0666))<0)
{
perror("shmget error");
exit(EXIT_FAILURE);
}
if((shm=shmat(shmid,NULL,0))==(char *)-1)
{
perror("shmat error");
printf("errno:%d\n",errno);
exit(EXIT_FAILURE);
}
s=shm;
for(c='a';c<='z';c++)
*s++=c;
*s=NULL;
while(*(char*)shm!='*') sleep(1);
shmdt(shm);
exit(EXIT_SUCCESS);
}

消费者代码(consumer.c):
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#define EXIT_FAILURE -1
#define EXIT_SUCCESS 0
#define SHMSZ 100
#define PATH "/tmp"
int main(void)
{
intshmid;
void *shm;
char *s;
key_t key;
key=ftok(PATH,'a');
if((shmid=shmget(key,SHMSZ,0666))<0)
{
perror("shmget error");
exit(EXIT_FAILURE);
}
if((shm=shmat(shmid,NULL,0))==(char *)-1)
{
perror("shmat error");
exit(EXIT_FAILURE);
}
for(s=(char*)shm;*s!=NULL;s++)
putchar(*s);
putchar('\n');
*(char*)shm='*';
shmdt(shm);
exit(EXIT_SUCCESS);
}
展开
 我来答
匿名用户
2014-12-30
展开全部
  1.                

  2. 1

  3. 自己稍微改改

  4. 1

  5. 2

  6. 3

  7. 4

  8. 5

  9. 6

  10. 7

  11. 8

  12. 9

  13. 10

  14. 11

  15. 12

  16. 13

  17. 14

  18. 15

  19. 16

  20. 17

  21. 18

  22. 19

  23. 20

  24. 21

  25. 22

  26. 23

  27. 24

  28. 25

  29. 26

  30. 27

  31. 28

  32. 29

  33. 30

  34. 31

  35. 32

  36. 33

  37. 34

  38. 35

  39. 36

  40. 37

  41. 38

  42. 39

  43. 40

  44. 41

  45. 42

  46. 43

  47. 44

  48. 45

  49. 46

  50. 47

  51. 48

  52. 49

  53. 50

  54. 51

  55. 52

  56. 53

  57. 54

  58. 55

  59. #include <stdio.h>

  60. #include <pthread.h>

  61. char data[5];//仓库,用于存放char

  62. int size = 0;//库存数

  63. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

  64. pthread_cond_t full = PTHREAD_COND_INITIALIZER;

  65. pthread_cond_t empty = PTHREAD_COND_INITIALIZER;

  66. void print(){

  67.   int i;

  68.   for(i=0;i<size;i++){

  69.     printf("%c ",data[i]);

  70.   }

  71.   printf("\n");

  72. }

  73. //生产者线程

  74. void* product(void *p){

  75.   char c;

  76.   for(c='A';c<='Z';c++){

  77.     pthread_mutex_lock(&mutex);//mutex内部才能使用cond

  78.     while(size==5) //阻塞生产同时释放互斥 (旋锁)

  79.       pthread_cond_wait(&full,&mutex);//阻塞生产线程

  80.     printf("PUSH %c\n",c);

  81.     data[size] = c;

  82.     usleep(10000);

  83.     size++;

  84.     print();

  85.     pthread_cond_broadcast(&empty);//释放消费cond

  86.     pthread_mutex_unlock(&mutex);

  87.     usleep(200000);

  88.   }

  89. }

  90. //消费者线程

  91. void* custom(void *p){

  92.   int i;

  93.   for(i=0;i<52;i++){

  94.     pthread_mutex_lock(&mutex);

  95.     while(size==0)

  96.       pthread_cond_wait(&empty,&mutex);

  97.     printf("POP %c\n",data[size-1]);

  98.     size--;

  99.     print();

  100.     pthread_cond_broadcast(&full);

  101.     pthread_mutex_unlock(&mutex);

  102.     usleep(400000);

  103.   }

  104. }

  105. int main(){

  106.   pthread_t id1,id2,id3;

  107.   pthread_create(&id1,0,product,0);

  108.   pthread_create(&id3,0,product,0);

  109.   pthread_create(&id2,0,custom,0);

  110.   pthread_join(id1,0); pthread_join(id2,0);

  111.   pthread_join(id3,0);

  112.   pthread_mutex_destroy(&mutex);

  113. }

追问
亲,对我的代码修改,你这代码不符合我的要求,我要是会改我就改我自己的啦?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式