带有互斥的

时间:2015-11-19 10:48:03

标签: c linux pthreads mutex

嗨我有模拟马场的程序,有一些地方有食物和一些马,马吃食物。如果没有食物马给农民发出信号,他会添加更多的食物。

这是我的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(农民不添加食物)。

我希望通过马匹进食无限循环并由农民添加食物。

1 个答案:

答案 0 :(得分:1)

您正在初始化cond两次:pthread_cond_t cond= PTHREAD_COND_INITIALIZER;pthread_cond_init(&(cond), NULL);。只需删除第二个。

您没有初始化mutexpthread_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内容。

这可以解决您的编程错误。