【问题标题】:ProducerConsumer problem生产者消费者问题
【发布时间】:2011-09-22 09:12:56
【问题描述】:

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

procA {
     而(真){
     
      更新(x);
      
     检索(y);
      }
     }
     过程B {
     而(真){
     检索(x);
     
     更新(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(仅部分输出)

答:1258442020 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 答:803738656 乙:1317969989 答:803738656 答:1251276256 答:1251276256 答:1251276256 答:1251276256 答:1251276256 答:1251276256 答:1251276256 答:1251276256 答:1251276256 答:1251276256 答:1251276256 乙:1851766329 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464 乙:455345464

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

谢谢。

【问题讨论】:

  • 使 while 循环无限并告诉我们输出的样子。
  • 随机数只被其他进程改变,所以只在它活跃时改变。还要记住你的行“wa1+1”和“wa2+1”什么都不做;它们必须是“wa1++”才能生效。
  • 哦,wa1 和 wa2 永远不会被写入。这也是为什么这些值不会改变的原因。编辑:哦,是的,他们是,对不起。这段代码太复杂了。
  • 当我把它作为“wa1++”给它时,它没有被编译,所以我把它改成了这种方式。这些基本上是在增加指向的地址,我的印象是 &wa1/&wa2 每次循环迭代时都会更新。你能在这里指出我的错误吗?
  • 你所做的就像写3+1;。要增加指针中的地址,您必须编写 wa1=wa1+1wa1++

标签: c multithreading producer-consumer


【解决方案1】:

十次迭代是如此之少,以至于它们在上下文切换发生之前就被处理了,所以你不会看到任何并发。很抱歉,我无法从您的代码中真正看出任何内容,因为它缺少缩进、cmets 和好的变量名。

【讨论】:

  • 对不起,也需要执行这些活动。我的错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-27
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多