生产者消费者问题

时间:2011-09-22 09:12:56

标签: c multithreading producer-consumer

我正在尝试使用线程翻译下面的场景。      

procA {
     while (TRUE) {
     
      update(x);
      
     retrieve(y);
      }
     }
     procB {
     while (TRUE) {
     retrieve(x);
     
     update(y);
     
      }
     }

已为我在下面提供的代码编写了代码:

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

#define WORK_SIZE 10
pthread_mutex_t work_mutex;
int wa1[WORK_SIZE];
int wa2[WORK_SIZE];
void *funA(void *);
void *funB(void *);
int main(){

 pthread_t tid1,tid2;

 if(pthread_create(&tid1,NULL,funA,(void *)wa1))
    perror("pthread_create");
 if(pthread_create(&tid2,NULL,funB,(void *)wa2))
   perror("pthread_create");

 pthread_join(tid1,NULL);
  pthread_join(tid2,NULL);

  return 0;
 }


  void *funA(void *ptr){
  int *x=ptr;
   int i=0,j,num;
   //sleep(1);
  while(i<=10){
    num=rand();
   *x=num;
    x+1;
    j=*wa2;
  printf("A: %d\n",j);
    wa2+1;
     i++;
      }
   return NULL;
    }

 void * funB(void *ptr){
   int *y=ptr;
   int a=0,b,num;
    while(a<=10){
     num=rand();
     b=*wa1;
    printf("B: %d\n",b);
     wa1+1;
    *y=num;
    y+1;
    a++;
   }
    return NULL;
   }

我需要实现MUTEX,但这将在后面进入图片。现在作为我的理解,两个线程应该同时进行,因此* wa1和* wa2指向的地址应该同时更新。似乎我遗漏了一些因为产生的输出是: 包含无限循环。更新后的o / p(仅输出的一部分)

A: 1258442020
A: 803738656
A: 803738656
A: 803738656
A: 803738656
A: 803738656
A: 803738656
A: 803738656
A: 803738656
A: 803738656
A: 803738656
A: 803738656
A: 803738656
A: 803738656
A: 803738656
A: 803738656
B: 1317969989
A: 803738656
A: 1251276256
A: 1251276256
A: 1251276256
A: 1251276256
A: 1251276256
A: 1251276256
A: 1251276256
A: 1251276256
A: 1251276256
A: 1251276256
A: 1251276256
B: 1851766329
B: 455345464
B: 455345464
B: 455345464
B: 455345464
B: 455345464
B: 455345464
B: 455345464
B: 455345464
B: 455345464
B: 455345464
B: 455345464
B: 455345464
B: 455345464
B: 455345464
B: 455345464

似乎在无限循环之后,发生了上下文切换,但我仍然不清楚输出。随机函数应生成一个新数字,但相同的数字会重复。请提出任何建议以及如何将其称为生产者 - 消费者问题如何实施此问题的方式比我实施的方式更好

感谢。

1 个答案:

答案 0 :(得分:0)

十次迭代很少,以至于在上下文切换发生之前处理它们,因此您不会看到任何并发性。对不起,我无法从代码中说出任何内容,因为它缺少缩进,注释和良好的变量名称。

相关问题