我有一个带有多个线程的进程。我已经使用__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
答案 0 :(得分:0)
pthread_atfork
规范不需要其实现来序列化对prepare
和parent
处理程序的调用,因此可以安全地假设没有同步。
glibc
implementation does lock an internal mutex,可防止多个线程并行进入处理程序。但是,这是一个实现细节。代码中的注释说,这种实现不符合POSIX,因为POSIX要求pthread_atfork
是异步信号安全的,并且在那里使用互斥锁使其不是异步信号安全的。
为了使代码更健壮,我建议使用原子或互斥量来保护共享状态免于竞争条件。