2016-03-09 7 views
0

У меня возникла проблема с компиляцией моей программы, когда я тестирую что-то вроде «./philo -p 3 -e 4». Я получаю сообщение об ошибке philo: tpp.c: 62: __pthread_tpp_change_priority: Утверждение `new_prio == -1 || (new_prio> = __sched_fifo_min_prio & & новый_prio < = __sched_fifo_max_prio) 'не удалось. AbortedПроблемы с pthread в C

Но я не понимаю, откуда оно взялось, поскольку оно работает иногда, например, если я тестирую «./philo -p 2 -e 4», это не сбой.

Два .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__ */ 

И это мой .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); 
} 

ответ

2

Вы не инициализировать какой-либо из ваших мьютексы с pthread_mutex_init.

И если предположить lphilo_release_chopstick ничего не делает, но разблокировать мьютекс, этот код не так, как он будет пытаться разблокировать каждый мьютекс дважды:

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

Где я должен добавить pthread_mutex_init? Я попытался добавить его перед pthread_create, но я не работаю – Michael003

+0

@ Michael003 - Сразу после вас 'malloc()' это будет хорошее место. –

 Смежные вопросы

  • Нет связанных вопросов^_^