ПроизводительПотребительская проблема - PullRequest
0 голосов
/ 22 сентября 2011

Я пытаюсь перевести сценарий ниже, используя темы.

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 голосов
/ 22 сентября 2011

Десять итераций так мало, что они обрабатываются до того, как произойдет переключение контекста, поэтому вы не увидите параллелизма.Мне жаль, что я ничего не могу сказать из вашего кода, потому что в нем нет отступов, комментариев и хороших имен переменных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...