Linux 具有互斥锁的线程

Linux thread with 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(农民不添加食物)。

我想无限循环马吃草,农夫加菜

您正在初始化 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 话题里的东西。

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