如何解决在分叉和分叉子进程时等待 std::condition_variable 无法恢复它
我试图理解多线程分叉。那么在下面的场景中会发生什么?
- 应用程序线程产生了一个线程 - 轮询线程
- 应用线程运行 fork
- atpthread_fork 处理程序的 pre_fork 使用 std::condition_variable 停止轮询线程。它还等待不同的条件变量以恢复轮询
- atpthread_fork 处理程序在 child 中的 post_fork 为等待的轮询线程执行 cv.notify_one 并停止轮询线程
- 父级中的atpthread_fork 处理程序的post_fork 为等待的轮询线程执行cv.notify_one 并恢复轮询线程
但是发生的情况是,子进程中的 post_fork 进入了一个无限循环,它一直在等待。这似乎也根本没有通知轮询线程 cv。
为什么会这样?
解决方法
我正在尝试使用多线程来理解分叉。
关于将分叉与多线程相结合,首先要理解的是不要这样做。除了少数特殊情况外,这种组合存在很大问题。
那么在下面的场景中会发生什么?
- 应用程序线程产生了一个线程 - 轮询线程
- 应用线程运行 fork
- atpthread_fork 处理程序的 pre_fork 使用 std::condition_variable 停止轮询线程。它也在不同的条件下等待 恢复轮询的变量
这没有意义。条件变量无权抢先停止任何线程。如果轮询线程最终确实通过阻塞 CV 而停止,那么不同的 CV 在重新启动它时必须扮演什么角色?
- atpthread_fork 处理程序在 child 中的 post_fork 为等待的轮询线程执行 cv.notify_one 并停止轮询线程
我想您的意思是说通过 pthread_atfork
注册的 post_fork 处理程序在子进程中执行 cv.notify_one
以恢复轮询线程。
无论如何,孩子不可能对轮询线程做任何事情,因为它没有轮询线程。子进程只有一个线程——调用 fork()
的线程的副本。这是 fork 和多线程不混合的主要原因之一。
- 父级中的atpthread_fork 处理程序的post_fork 为等待的轮询线程执行cv.notify_one 并恢复轮询线程
鉴于您归因于简历的整体有问题的行为,这似乎有问题,但这个概念本身并没有错。
但是发生的情况是,子进程中的 post_fork 进入了一个无限循环,其中 它一直在等待。
这里缺少一些东西。您是否正在定时等待?它的等待失败了吗?这些是我能想到的孩子既可以循环又可以等待的唯一方法。子进程中最初没有其他线程来唤醒由 fork 产生的单个线程,因此该线程无法从对任何 CV 的等待中成功返回,除非是虚假的。没有人发出信号。
这似乎也没有通知民意调查 线程简历。
你是说孩子中不存在的那个吗?或者父母中可能没有等待您认为正在等待的简历的那个?
以上大部分内容都没有实际意义。绝对没有理由认为您的程序正在执行特殊例外之一,因此请参阅#1:不要将分叉与多线程结合使用。选择一个。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。