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

时间:2016-04-30 19:14:57

标签: c multithreading fflush

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

kill

这个想法是网络管理员可以使用SIGUSR1命令将缓冲的日志条目刷新到日志文件,以便向Web代理发送fflush信号。但是,我不确定在信号处理程序中调用fflush是个好主意。我知道fflush是线程安全的,但不要认为它是异步信号安全的。在多线程的信号处理程序中调用df[1:3]会产生什么并发问题?

1 个答案:

答案 0 :(得分:3)

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

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