gpt4 book ai didi

在多线程信号处理程序中调用 fflush?

转载 作者:行者123 更新时间:2023-12-01 13:44:34 25 4
gpt4 key购买 nike

我有一个实现多线程网络代理的基本草图:

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 命令向 Web 代理发送 SIGUSR1 信号,将缓冲的日志条目刷新到日志文件中。但是,我不确定在信号处理程序中调用 fflush 是个好主意。我知道 fflush 是线程安全的,但不认为它是异步信号安全的。在多线程的信号处理程序中调用 fflush 会引起什么并发问题?

最佳答案

假设您的线程调用一个标准 IO 函数,该函数锁定一个保护流数据结构的互斥锁。在解锁该互斥锁之前,会传递一个信号,并调用您的信号处理程序。您的信号处理程序调用 fflush() 并尝试锁定互斥锁。您的线程和您的标准 IO 流现在将永远死锁,因为您的信号处理程序将等待互斥量,但它永远不会可用,因为您的线程将阻塞直到信号处理程序返回。这是一个典型的僵局。

这就是线程和信号处理程序之间的区别。如果一个线程试图锁定一个互斥量并发现它已经被锁定,它就会进入休眠状态,其他线程将运行,持有互斥量的线程迟早会解锁它。但是您的信号处理程序不是线程,因此它不会进入休眠状态并让被中断的线程运行 - 该线程只会阻塞直到信号处理程序返回,在上面的示例中,它永远不会。

关于在多线程信号处理程序中调用 fflush?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36959118/

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