gpt4 book ai didi

处理标准输出的并发问题

转载 作者:太空宇宙 更新时间:2023-11-04 03:41:33 24 4
gpt4 key购买 nike

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

        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 库,这很可能会起作用。

关于处理标准输出的并发问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28015234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com