C 处理sdtout的并发问题

C 处理sdtout的并发问题,c,multithreading,concurrency,thread-safety,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 *)(&am

因此,我有一个进程,它创建了三个线程来执行它们的任务,当它们执行任务时,它们会在控制台上打印操作。
大体上我有

        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);
在每个线程函数中,我都有一个
printf(“线程…开始”)
后跟一个
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库,这很可能会起作用。

您是否尝试过
fflush(stdout)
printf()之后?是的。每个printf调用都有一个fflush following。
stdout
默认为行缓冲。您可以通过执行以下操作完全禁用缓冲:如果希望立即输出不带换行符的数据。请记住,这可能不会完全满足您的要求。如果您希望每个线程在不交错的情况下保证每次调用都有一个完整的消息,那么您可能会被迫使用共享锁(例如,互斥锁)包装您自己的
myprintf
var arg等价物。从外观上看,这两个串联在一起可能就是你想要的。我相信我在stdio中使用了printf。这就是我使用的标准c库的意思吗
不管怎样,您的宏现在可以为所有开始的线程打印“欢迎消息”。我是,可能是一些线程根本没有开始?(完全没有编译错误或警告消息)a不,我运行了几次程序,有时所有线程都会打印消息,有时只有一条,有时只有两条。它们现在正在打印吗?另外,使用
valgrind--tool=helgrind
检测线程错误。@Crysis85 Oh,要检查线程是否启动,只需检查
pthread_create()
的返回值即可。