简体   繁体   English

C中的pthread问题

[英]Issues with pthread in C

I have a problem with the compiling of my program, when I test something like "./philo -p 3 -e 4" I get the error philo: tpp.c:62: __pthread_tpp_change_priority: Assertion `new_prio == -1 || 我在测试“ ./philo -p 3 -e 4”之类的程序时遇到了问题,我收到了错误philo:tpp.c:62:__pthread_tpp_change_priority:声明new_prio == -1 || (new_prio >= __sched_fifo_min_prio && new_prio <= __sched_fifo_max_prio)' failed. (new_prio> = __sched_fifo_min_prio && new_prio <= __sched_fifo_max_prio)'失败。 Aborted 中止

But I don't understand where it does come from, as it's working sometimes, for exemple if I test "./philo -p 2 -e 4" it doesn't crash. 但是我不知道它的来源,因为它有时工作,例如,如果我测试“ ./philo -p 2 -e 4”,它不会崩溃。

The two .h 两个.h

#ifndef                 _PHILO_H_
# define                _PHILO_H_
#include                <pthread.h>

typedef struct          s_philosop
{
  pthread_t             philosophers;
  pthread_mutex_t       *chopsticks1;
  pthread_mutex_t       *chopsticks2;
  int                   nbr_occ;
}                       t_philosop;

int                     parse_arg(char **argv, int *philo, int *occ);
int                     create_threads_mutex(int nbr_philo, int occurences);
void                    *start_routine(void *arg);
void                    philosoph_eating_chopsticks(t_philosop *philosop);

#endif                  /* !_PHILO_H_ */


#ifndef __LIBRICEFEREE_EXTERN__
# define __LIBRICEFEREE_EXTERN__

#include <pthread.h>
int     RCFStartup(int ac, char **av);
void    RCFCleanup();
int     lphilo_eat();
int     lphilo_sleep();
int     lphilo_think();
int     lphilo_take_chopstick(const pthread_mutex_t *mutex_id);
int     lphilo_release_chopstick(const pthread_mutex_t *mutex_id);

#endif  /* __LIBRICEFEREE_EXTERN__ */

And this is my .c 这是我的.c

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include "philo.h"
#include "extern.h"

void                    philosoph_comportement(t_philosop *philosop)
{
  int                   i = 0;
  if ((pthread_mutex_lock(philosop->chopsticks1)) == 0)
    {
      printf("%s\n", "Taking left stick");
      lphilo_take_chopstick(philosop->chopsticks1);
      i++;
    }
  if ((pthread_mutex_lock(philosop->chopsticks2)) == 0)
    {
      printf("%s\n", "Taking right stick");
      lphilo_take_chopstick(philosop->chopsticks2);
      i++;
    }
  if (i == 2)
    {
      printf("%s\n", "Eat");
      lphilo_eat();
      sleep(1);
      printf("%s\n", "Sleep");
      pthread_mutex_unlock(philosop->chopsticks1);
      pthread_mutex_unlock(philosop->chopsticks2);
      lphilo_release_chopstick(philosop->chopsticks1);
      lphilo_release_chopstick(philosop->chopsticks2);
      lphilo_sleep();
    }
}

void                    *start_routine(void *arg)
{
  t_philosop            *philosop;
  int                   i;

  i = 0;
  philosop = (t_philosop *)arg;
  while (i != philosop->nbr_occ)
    {
      philosoph_comportement(philosop);
      i++;
    }
  return (0);
}

int                     create_threads_mutex(int nbr_philo, int occurences)
{
  int                   i;
  t_philosop            *philosop;
  pthread_mutex_t       *chopsticks;

  i = -1;
  if ((chopsticks = malloc(sizeof(pthread_mutex_t) * nbr_philo)) == NULL)
    return (2);
  if ((philosop = malloc(sizeof(t_philosop) * nbr_philo)) == NULL)
    return (2);
  while (++i != nbr_philo)
    {
      philosop[i].nbr_occ = occurences;
      philosop[i].chopsticks1 = &chopsticks[i];
      if (i - 1 < 0)
        philosop[i].chopsticks2 = &chopsticks[nbr_philo];
      else
        philosop[i].chopsticks2 = &chopsticks[i - 1];
    }
  i = -1;
  while (++i != nbr_philo)
    pthread_create(&philosop[i].philosophers, NULL, start_routine, &philosop[i]);
  i = -1;
  while (++i != nbr_philo)
    {
      printf("Philo number : %d\n", i);
      pthread_join(philosop[i].philosophers, NULL);
    }
  return (0);
}

int                     parse_arg(char **argv, int *philo, int *occ)
{
  if (strcmp(argv[1], "-p") == 0 && strcmp(argv[3], "-e") == 0 &&
      argv[2] != NULL && argv[4] != NULL)
    {
      *philo = atoi(argv[2]);
      *occ = atoi(argv[4]);
    }
  else if (strcmp(argv[1], "-e") == 0 && strcmp(argv[3], "-p") == 0 &&
           argv[2] != NULL && argv[4] != NULL)
    {
      *philo = atoi(argv[4]);
      *occ = atoi(argv[2]);
    }
  else
    return (2);
  return (0);
}

int                     main(int argc, char **argv)
{
  int                   philo;
  int                   occurences;

  philo = 0;
  occurences = 0;
  if (argc != 5)
    return (2);
  if ((parse_arg(argv, &philo, &occurences)) == 2)
    return (2);
  RCFStartup(argc, argv);
  if ((create_threads_mutex(philo, occurences)) == 2)
    return (2);
  RCFCleanup();
  return (0);
}

You don't initialize any of your mutexes with pthread_mutex_init . 您无需使用pthread_mutex_init初始化任何互斥锁。

And assuming lphilo_release_chopstick does nothing but unlock a mutex, this code is wrong as it will try to unlock each mutex twice: 并假设lphilo_release_chopstick除了解锁互斥锁外什么也不做,此代码是错误的,因为它将尝试对每个互斥锁进行两次解锁:

  pthread_mutex_unlock(philosop->chopsticks1);
  pthread_mutex_unlock(philosop->chopsticks2);
  lphilo_release_chopstick(philosop->chopsticks1);
  lphilo_release_chopstick(philosop->chopsticks2);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM