如果两个线程同时调用fork()会发生什么

时间:2019-06-20 12:21:54

标签: linux multithreading process kernel fork

我有一个带有多个线程的进程。我已经使用__register_atfork(blocksigprof,restoresigprof,NULL,NULL)注册了prepare函数和父处理程序。 功能。 现在让我们假设两个线程同时调用fork。而且我在blockigprof中有一个计数器增量,在restoresigprof中有一个计数器递减。

考虑到以上情况,blockigprof和restoresigprof是否总是成对调用? __register_atfork是否有固有的锁定机制。

SELECT ProductId
FROM @Product
GROUP BY ProductId
HAVING MIN(Code) >= 3 AND
       SUM(CASE WHEN Code = 9 THEN 1 ELSE 0 END) = 0

1 个答案:

答案 0 :(得分:0)

pthread_atfork规范不需要其实现来序列化对prepareparent处理程序的调用,因此可以安全地假设没有同步。

glibc implementation does lock an internal mutex,可防止多个线程并行进入处理程序。但是,这是一个实现细节。代码中的注释说,这种实现不符合POSIX,因为POSIX要求pthread_atfork是异步信号安全的,并且在那里使用互斥锁使其不是异步信号安全的。

为了使代码更健壮,我建议使用原子或互斥量来保护共享状态免于竞争条件。