当多个线程在 C 中写入同一个文件描述符时,如何防止竞争情况?

问题描述 投票:0回答:1

我有以下将在线程中运行的函数:

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实现的链接,太大了,放在这里

c multithreading printf mutex
1个回答
0
投票

POSIX 要求

printf
是线程安全的。

© www.soinside.com 2019 - 2024. All rights reserved.