C中pthread的问题

时间:2016-03-09 14:17:21

标签: c multithreading pthreads mutex assertion

编译我的程序时出现问题,当我测试类似“./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)'失败。 中止

但我不明白它的来源,因为它有时会起作用,例如,如果我测试“./philo -p 2 -e 4”它不会崩溃。

两个.h

SELECT p.post_id, COUNT(c.post_id) as num_comments, COUNT(l.like_id) as num_likes
FROM app_posts AS p
LEFT JOIN app_comments AS c ON c.post_id = p.post_id
LEFT JOIN app_user AS u ON u.user_id = p.user_id
LEFT JOIN app_likes AS l ON l.post_id = p.post_id
WHERE u.user_banned = 0
AND p.post_public = 1
GROUP BY  p.post_id
ORDER BY p.post_date DESC

这是我的.c

#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__ */

1 个答案:

答案 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);