Pergunta

Então, estou trabalhando nesse código que é um código do produtor-consumidor. Ele percorre completamente o programa, nunca executa nada na seção crítica, porque nunca acorda do sono! Adicionei instruções de impressão em todos os lugares para tentar descobrir onde o código está executando e ele entra nas funções do produtor e do consumidor, mas nunca entra em nenhuma parte após a função Sleep ().

Aqui está o meu principal:

 /* 1. Get command line arguments argv[1], argv[2], argv[3] */

 /* n1=arg[2], n2=arg[3]
 /* 2. Initialize buffer, mutex, semaphores, and other global vars */

 /*create the mutex lock */
 /* create the semaphore and initialize it to 3 */
 /*creating full semaphore and initializing it to 0 */




/*** critical section ***/


 /* get the default attribute */
 pthread_attr_init(&attr);
 /* 3. Create producer thread(s) */
 while (count < n1)
   {
     pthread_t tid;
     /* create a new thread */
     pthread_create(&tid, &attr, producer, NULL);
     count++;
   }
     printf("OUTSIDE OF PRODUCER CREATION\n");
 /* 4. Create consumer thread(s) */
 count = 0;
 while(count < n2)
   {
     pthread_t tid2;
     /* create a new thread */
     pthread_create(&tid2, &attr, consumer, NULL);
     count++;
   }

 printf("after the crit section \n");
 /* 5. Sleep */
 /* 6. Realease resources, e.g destroy mutex and semaphores */

Incluí na maioria das vezes o código que sei que estou tendo um problema e o resto são comentários. E aqui está o código para o meu produtor. O consumidor é basicamente o mesmo:

void *producer(void *param) {
    buffer_item rand;
    unsigned int *seed;
    seed = (unsigned int *)malloc(sizeof(unsigned int));
    *seed = 10;
    while (1) {
        printf("Inside producer function\n");
        /* Sleep for a random period of time */
        r = (rand_r(seed))/divide;
        sleep(r);
        printf("producer slept\n");
        //wait(empty)
       //wait(mutex)
       printf("producer locked mutex\n");
       //crit section - add item to buffer
       /*Generate a random number */
       /*insert random number*/
       printf("producer inserted item \n");
       if (resp < 0)
           printf("Producer error condition\n"); //Report error condition
       //signal mutex
       //signal empty
    }
}

Então, quando eu corro A.out 4 4 4, entendo isso como minha saída:

Inside producer function
Inside producer function
Inside producer function
OUTSIDE OF PRODUCER CREATION
Inside producer function
inside consumer function
inside consumer function
inside consumer function
after the crit section 
inside consumer function

Não tenho certeza se é normal que as coisas parecem estar ficando sem ordem ... está executando 4 vezes, mas como você pode ver se nunca atingir a declaração de impressão que acontece após minha função de sono (tanto para produtor quanto para consumidor)

Este é o dever de casa, então estou apenas procurando um pouco mais de direção sobre isso ...

Foi útil?

Solução

Da discussão, seu erro foi que o seu sleep() Os valores eram muito grandes, um que você citou para 22 minutos. Em vez de divisão (/) para limitar os valores, Modulo (%) colocará seus valores dentro de um intervalo. Eu recomendo %10, ou algum outro valor que limitará o sono a um intervalo razoável.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top