Почему мой производитель/потребитель не проснется? В

StackOverflow https://stackoverflow.com/questions/19842164

Вопрос

Так что я работаю над этим кодом, который является продюсером-потребителем кода. Он полностью проходит через программу, она просто никогда не выполняет ничего в критическом разделе, потому что она никогда не просыпается от сна! Я добавил печатные операторы повсюду, чтобы попытаться выяснить, где выполняется код, и он вводит функции как производителя, так и потребителей, но никогда не вводит какую -либо его часть после функции Sleep ().

Вот мой главный:

 /* 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 */

Я включил по большей части только код, с которым я знаю, у меня проблемы, а остальные - комментарии. А вот код для моего продюсера. Потребитель в основном такой же:

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

Поэтому, когда я запускаю A.out 4 4 4, я получаю это как свой вывод:

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

Я не уверен, что нормально, что все выглядит так, как будто у них не хватает порядка ... он выполняет 4 раза, но, как вы можете видеть, не ударяет ли никогда, что печатное утверждение происходит после моей функции сна (как для производителя, так и для потребителя)

Это домашнее задание, так что я просто ищу немного больше направления на это ...

Это было полезно?

Решение

Из обсуждения ваша ошибка заключалась в том, что ваша sleep() Значения были слишком большими, одна из которых вы процитировали, выходящие до 22 минут. А не подразделение (/) ограничить значения, модуло (%) поместит ваши значения в диапазоне. Я рекомендую %10, или какое -то другое значение, которое ограничит сна разумное диапазон.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top