我使用boost ASIO构建了一个C++库.该库需要既是线程安全的又是fork安全的.它有服务调度程序线程,它调用io_service::run().为了支持fork-safety,我已经注册了pre_fork,post_fork_parent和post_fork_child处理程序.该pre_fork()处理程序,调用_io_service.notify_fork(boost::io_service:fork_prepare(),post_fork_parent处理程序调用_io_service.notify_fork(boost::asio::io_service::fork_parent)和post_fork_child电话_io_service.notify_fork(boost::asio::io_service::fork_child).
我fork()遇到的问题是,当发生这种情况时,服务调度程序线程可能处于某个操作的中间,并且可能已获取io_service对象的数据成员的锁定.因此,当我们调用_io_service.notify_fork(boost::asio::io_service::fork_child)它时,子进程看到它们处于相同的状态和post_fork_child()中,它试图获取同一对象的锁,因此无限期地被阻塞(因为子进程中没有线程可以释放解锁).
我在子进程中看到的堆栈跟踪被阻止,是 -
fffffd7ffed07577 lwp_park (0, 0, 0)
fffffd7ffecffc18 mutex_lock_internal () + 378
fffffd7ffecfffb2 mutex_lock_impl () + 112
fffffd7ffed0007b mutex_lock () + b
fffffd7fff26419d __1cFboostEasioGdetailLscoped_lock4n0CLposix_mutex__2t5B6Mrn0D__v_ () + 1d
fffffd7fff2866a2 __1cFboostEasioGdetailQdev_poll_reactorMfork_service6Mn0BKio_serviceKfork_event__v_ () + 32
fffffd7fff278527 __1cFboostEasioGdetailQservice_registryLnotify_fork6Mn0BKio_serviceKfork_event__v_ () + 107
fffffd7fff27531c __1cDdesGtunnelQServiceSchedulerPpost_fork_child6M_v_ () + 1c
fffffd7fff29de24 post_fork_child () + 84
fffffd7ffec92188 _postfork_child_handler () + 38
fffffd7ffecf917d fork () + 12d
fffffd7ffec172d5 fork () + …Run Code Online (Sandbox Code Playgroud)