我有以下将在线程中运行的函数:
void *dinning_handler(void *arg)
{
t_philo *philo;
struct timeval start;
philo = (t_philo *)arg;
gettimeofday(&start, NULL);
philo->last_meal_time = start;
while (philo->max_eats == -1 || philo->eats < philo->max_eats)
{
print_blue("is thinking", philo->id, get_ts_in_ms());
pthread_mutex_lock(philo->left_fork);
pthread_mutex_lock(philo->right_fork);
print_blue("has taken a fork", philo->id, get_ts_in_ms());
print_green("is eating", philo->id, get_ts_in_ms());
usleep(philo->time_to_eat * 1000);
philo->eats++;
gettimeofday(&philo->last_meal_time, NULL);
pthread_mutex_unlock(philo->left_fork);
pthread_mutex_unlock(philo->right_fork);
print_blue("is sleeping", philo->id, get_ts_in_ms());
usleep(philo->time_to_sleep * 1000);
}
return (NULL);
}
每个打印功能将具有以下格式:
void print_red(char **msg, int id, long time)
{
ft_printf("\033[1;31m");
ft_printf("%u %d %s\n", time, id, msg);
ft_printf("\033[0m");
}
这会产生竞争条件,导致在终端中写入错误的值.如果我将ft_print(这是一个self 实现,它的工作方式应该与printf相同)替换为原始的printf,它可以很好地工作.为什么?在打印之前,printf是否使用互斥锁?我如何修复我的代码?
编辑:
Link对于ft_print tf实现,它太大了,不能放在这里