处理stdout的并发问题

时间:2015-01-18 21:54:34

标签: c multithreading concurrency thread-safety

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

        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)向那个线程发送消息,是否可行?还有更好的想法吗?

1 个答案:

答案 0 :(得分:1)

试试这个

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

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