3
我有实现多线程Web代理的基本素描:在多线程信号处理程序中调用fflush?
FILE *proxy_log_file;
static void
SIGUSR1_handler(int sig)
{
(void)sig;
fflush(proxy_log_file);
}
int
main(int argc, char **argv)
{
proxy_log_file = fopen("proxy.log", "a");
Signal(SIGUSR1, SIGUSR1_handler);
}
的想法是,网络管理员可以使用kill
命令将SIGUSR1
信号发送到Web代理刷新缓冲的日志记录到日志文件。但是,我不确定在信号处理程序中调用fflush
是个好主意。我知道fflush
是线程安全的,但不认为它是异步信号安全的。在多线程的信号处理程序中调用fflush
会产生什么并发性问题?
因此,我需要阻止异步传递并创建一个专用线程,通过调用'sigwait'来同步接收信号? – user6269144
不,您只需要调用不会对信号处理程序异步安全的函数。这样做并不安全。例如,您的信号处理程序可以设置一个标记,例如您已声明为volatile volatile sig_atomic_t,并且如果它检测到标记已设置,则其中一个线程可以刷新该流。或者,也可以使用信号以外的机制。 –
您所写的内容仅适用于受互斥锁保护的流。后者自C11起标准化。在C11标准之前,代码可能不会死锁,但仍可能会出现其他一些奇怪的行为,例如刷新另一个线程的半填充缓冲区。 – alk