我在理解pthread_atfork
如何使子进程确保互斥状态时遇到了一些问题。手册告诉我在创建子进程之前使用prepare
获取锁,并使用parent
和child
释放父进程和子进程中的锁。父进程p
有一个锁被锁了,它注册了三个fork处理程序后调用了fork,父进程和子进程的锁都应该被释放,不是吗?但是这不是我们所期望的,对吧?父锁的状态已经被修改了,而我们只想修改子锁的状态。
我在google上搜索过,也看到过堆栈溢出。我发现一个问题[https://stackoverflow.com/questions/5473368/pthread-atfork-locking-idiom-broken]与我的问题很接近,但这个答案并不能消除我的困惑。我不确定我是否误解了这个函数的用法,请任何人掌舵。
1条答案
按热度按时间twh00eeo1#
比如说,父进程p有一个锁,它被锁定了,并且它在注册了三个fork处理程序之后调用了fork。
父进程将在
prepare
中 * 阻塞 *,试图获取(已经在其他地方锁定的)锁。如果试图
fork
的线程本身持有锁,那么该线程将自死锁,这是一个编程错误(持有锁时fork
ing是一个禁忌)。如果 * 另一个 * 线程持有锁,则派生线程将等待(在
prepare
中)另一个线程释放锁,然后在fork
之后,父线程和子线程中的一切都将正常。如果你 * 知道 * forking线程(而不是其他线程)拥有这个锁,你 * 可以 * 在
fork
中保持这个锁,在这种情况下,你 * 不会 * 试图在prepare
中获取这个锁,也不会在parent
或child
中释放它。P.S.在实践中,在您不完全控制的多线程程序(即使用外部库的程序)中使用
fork
几乎不可能正确执行。