处理标准输出的并发问题

Concurrency problems dealing with sdtout

所以,我有一个进程创建了三个线程来执行它们的操作,当它们执行时,它们会在控制台上打印操作。
我主要有

        pthread_create (&window_manager, NULL, (void *) window_manager_receiver_func, (void *)(&args) );
        pthread_create (&send_ack, NULL, (void *) send_ack_func, (void *)(&args) );
        pthread_create (&receiver, NULL, (void *) receiver_func, (void *)(&args) );
        pthread_create (&file_writer, NULL, (void *) file_writer_func, (void *)(&args) );

        pthread_join(window_manager, NULL);
        pthread_join(send_ack, NULL);
        pthread_join(receiver, NULL);
        pthread_join(file_writer, NULL);

并且在每个 thread_func 中我有一个 printf("Thread ... starting") 后跟一个 fflush(stdout) 以确定线程是否开始 运行。问题不是所有线程都打印那个字符串,我想是同步问题吧?我该如何解决这个问题?我需要线程在控制台上打印东西,看看它们是否在做应该做的事情。
我的一个想法是创建另一个线程,它是控制台上唯一打印的线程(因此 stdio 上没有并发问题),其他线程使用命名管道(fifo)向该线程发送消息,是否可行?有更好的想法吗?

试试这个

#define mtprintf(...) do {                               \
        char message[1024];                              \
        snprintf(message, sizeof(message), __VA_ARGS__); \
        write(STDOUT_FILENO, message, strlen(message));  \
    } while (0);

这样你可以完全避免缓冲,虽然你可以看到有一个限制,而且 AFAIK printf()glibc 中是线程安全的但是因为我不知道你是哪个标准 c 库正在使用,这很可能会起作用。