Pregunta

Así que estoy trabajando en este código que es un código de consumidor productor. Se ejecuta completamente a través del programa, ¡en realidad nunca ejecuta nada en la sección crítica porque nunca se despierta del sueño! He agregado declaraciones de impresión en todas partes para tratar de averiguar dónde se está ejecutando el código, y ingresa tanto a las funciones del productor como al consumidor, pero nunca ingresa a ninguna parte después de la función Sleep ().

Aquí está mi 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 */

He incluido en su mayor parte solo el código con el que sé que tengo un problema y el resto son comentarios. Y aquí está el código para mi productor. El consumidor es básicamente el mismo:

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
    }
}

Entonces, cuando ejecuto A.Out 4 4 4, obtengo esto como mi salida:

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

No estoy seguro de si es normal que las cosas parezcan que se están agotando ... se está ejecutando 4 veces, pero como puede ver si nunca llega a esa declaración de impresión que ocurre después de mi función de sueño (tanto para el productor como para el consumidor)

Esta es la tarea, así que solo estoy buscando un poco más de dirección en esto ...

¿Fue útil?

Solución

De la discusión, su error fue que su sleep() Los valores eran demasiado grandes, uno que citó a 22 minutos. En lugar de división (/) para limitar los valores, módulo (%) pondrá sus valores dentro de un rango. yo recomiendo %10, o algún otro valor que limitará los durmientes a un rango razonable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top