嗨我有模拟马场的程序,有一些地方有食物和一些马,马吃食物。如果没有食物马给农民发出信号,他会添加更多的食物。
这是我的c程序:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
#define NUM 5
pthread_cond_t cond= PTHREAD_COND_INITIALIZER;
long food;
pthread_mutex_t mutex;
pthread_t horse[NUM];
pthread_t farmar;
pthread_mutex_t mutex;
void * funHorse(void *);
void * funFarmar(void *);
int main(int argc, char * argv[]){
food = 10;
pthread_cond_init(&(cond), NULL);
int i;
for(i = 0; i < NUM; i++){
pthread_create(&horse[i], NULL, funHorse,(void *) &i);
}
pthread_create(&farmar, NULL, funFarmar, NULL);
printf("Join farmar\n");
pthread_join(farmar, NULL);
for(i = 0; i < NUM; i++){
printf("Join horse\n");
pthread_join(horse[i], NULL);
}
return 0;
}
void * funHorse(void * param){
pthread_mutex_lock(&mutex);
int index = *((int*) param);
food--;
printf("Eating horse number %d there are %d food \n",index,food);
sleep(1);
if(food == 0){
printf("Horse number %d is hungry\n",index);
pthread_cond_signal(&cond);
}
pthread_mutex_unlock(&mutex);
}
void * funFarmar(void * param){
pthread_mutex_lock(&mutex);
printf("Sleeping\n");
pthread_cond_wait(&(cond),&(mutex));
food = 20;
printf("There are %d food \n",food);
pthread_mutex_unlock(&mutex);
}
有马只吃5次的问题。不知道为什么。如果我将食物的初始化更改为food = 2
...最后的结果为-3(农民不添加食物)。
我希望通过马匹进食无限循环并由农民添加食物。
答案 0 :(得分:1)
您正在初始化cond
两次:pthread_cond_t cond= PTHREAD_COND_INITIALIZER;
和pthread_cond_init(&(cond), NULL);
。只需删除第二个。
您没有初始化mutex
:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
应该完成这项工作。您有mutex
变量两次,删除一个。
您将i
的地址传递给线程,但主线程更改i
。你应该创建一个数组,并从这个数组中传递每个线程的另一个数字。
int number[NUM];
int i;
for(i = 0; i < NUM; i++){
number[i]=i;
pthread_create(&horse[i], NULL, funHorse,&number[i]);
}
你忘记了线程中的return
内容。
这可以解决您的编程错误。