嗨,我有一个模拟马场的程序,有些地方有食物,有些马,马吃食物。如果没有食物,马会向农民发出信号,他会添加更多食物。
这是我的 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(农民不添加食物)。
我想无限循环马吃东西,农民加食物。
最佳答案
您正在初始化 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]);
}
您忘记在线程中返回
一些东西。
这应该可以解决您的编程错误。
关于c - 带互斥量的 Linux 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33801717/