处理标准输出的并发问题
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 库正在使用,这很可能会起作用。
所以,我有一个进程创建了三个线程来执行它们的操作,当它们执行时,它们会在控制台上打印操作。
我主要有
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 库正在使用,这很可能会起作用。