linux pthread_atfork如何使子进程确保锁状态而不改变父进程的锁状态?

6jjcrrmo  于 2023-03-01  发布在  Linux
关注(0)|答案(1)|浏览(105)

我在理解pthread_atfork如何使子进程确保互斥状态时遇到了一些问题。手册告诉我在创建子进程之前使用prepare获取锁,并使用parentchild释放父进程和子进程中的锁。父进程p有一个锁被锁了,它注册了三个fork处理程序后调用了fork,父进程和子进程的锁都应该被释放,不是吗?但是这不是我们所期望的,对吧?父锁的状态已经被修改了,而我们只想修改子锁的状态。
我在google上搜索过,也看到过堆栈溢出。我发现一个问题[https://stackoverflow.com/questions/5473368/pthread-atfork-locking-idiom-broken]与我的问题很接近,但这个答案并不能消除我的困惑。我不确定我是否误解了这个函数的用法,请任何人掌舵。

twh00eeo

twh00eeo1#

比如说,父进程p有一个锁,它被锁定了,并且它在注册了三个fork处理程序之后调用了fork。
父进程将在prepare中 * 阻塞 *,试图获取(已经在其他地方锁定的)锁。
如果试图fork的线程本身持有锁,那么该线程将自死锁,这是一个编程错误(持有锁时fork ing是一个禁忌)。
如果 * 另一个 * 线程持有锁,则派生线程将等待(在prepare中)另一个线程释放锁,然后在fork之后,父线程和子线程中的一切都将正常。
如果你 * 知道 * forking线程(而不是其他线程)拥有这个锁,你 * 可以 * 在fork中保持这个锁,在这种情况下,你 * 不会 * 试图在prepare中获取这个锁,也不会在parentchild中释放它。
P.S.在实践中,在您不完全控制的多线程程序(即使用外部库的程序)中使用fork几乎不可能正确执行。

相关问题