我有以下将在线程中运行的函数:
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 (这是一个自我实现,假设与 printf 的工作方式相同)替换为原始 printf ,它就可以正常工作。为什么? printf 在打印之前使用互斥锁吗?我该如何修复我的代码?
编辑:
ft_printf实现的链接,太大了,放在这里
POSIX 要求
printf
是线程安全的。