繁体   English   中英

pthread_atfork锁定成语坏了吗?

[英]pthread_atfork locking idiom broken?

pthread_atfork用法的标准习惯用法是获取pre-fork处理程序中的所有锁,并在父处理程序和子处理程序中释放它们。 但据我所知,这是不可能的。 如果调用线程不是互斥锁的所有者,则指定pthread_mutex_unlock具有未定义的行为(在普通或默认类型互斥锁的情况下)或失败(在递归或错误检查互斥锁的情况下)。 在使用pthread_atfork注册的子处理程序中,调用线程是新创建的进程的主线程,因此不能是互斥锁的所有者。

我错了还是整个pthread_atfork成语被设计破坏并且基本上不可能使用?

编辑:我也没有看到该问题的任何有效(可移植)解决方法。 理想情况下,可以在子进程中销毁和重新初始化互斥锁,除了在初始化的互斥锁上调用pthread_mutex_destroy被指定为未定义的行为,以适应互斥体不是POD但涉及对某些内核级对象的引用的荒谬实现。

我认为这是男人的相关文字:

调用fork()时,只有子进程中的调用线程重复 同步变量在子节点中保持与fork()调用时父节点相同的状态。 因此,例如,互斥锁可以由子进程中不再存在的线程保持,并且任何关联的状态可能不一致。 父进程可以通过显式代码来避免这种情况,该代码通过pthread_atfork()获取和释放对子进程至关重要的锁。 此外,任何关键线程都需要重新创建并重新初始化为子级中的正确状态(也可以通过pthread_atfork())。

在子节点中执行atfork处理程序的线程是在父节点中执行atfork prepare处理程序的线程的精确副本,因此有权解锁互斥锁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM