所以我正在研究这个生产者 - 消费者代码的代码。它完全通过程序运行,它实际上从未在临界区执行任何操作,因为它永远不会从睡眠中醒来!我在任何地方都添加了print语句,试图找出代码执行的位置,并且它进入了生产者和消费者函数,但是在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次但是你可以看到,如果你的睡眠功能发生后从未发出打印声明(对于生产者和消费者)
这是作业,所以我只想在这方面寻找更多方向...
答案 0 :(得分:1)
从讨论中,您的错误是您的sleep()
值太大,您引用的值为22分钟。 modulo(/
)不是将(%
)除以值来限制值,而是将值放在一个范围内。我建议使用%10
或其他一些将睡眠时间限制在合理范围内的值。