c - 带互斥量的 Linux 线程

标签 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(农民不添加食物)。

我想无限循环马吃东西,农民加食物。

最佳答案

您正在初始化 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/

相关文章:

c - 为什么使用 & 运算符时 char* 和 char[x] 之间的差异很重要

c - 在 C 中使用 strcspn 和 fgets 的登录功能问题

c - 如何加入/分离/清理每个函数调用创建的动态 malloc 线程?

linux - 如何在已编译的应用程序中替换 main()?

linux - SOCK_SEQPACKET正在缓冲约42k的数据,如何将其限制为更少?

c - 重复文件查找算法的建议(使用 C)

c++ - C++11 的 std::thread 与 POSIX 信号量兼容吗?

c - 为什么打印一个char数组后有一个10?

c - 文件/程序范围内的二维数组

linux - 调试用户输入时启用断点 (gdb/linux)