我在perl中有一个多线程应用程序,我必须依赖几个非线程安全模块,所以我一直使用fork()
带有kill()
信号的ed进程作为消息传递接口.
问题是信号处理程序有点不稳定(至少可以说)并且经常最终导致在不适当的状态下被杀死的进程.
有一个更好的方法吗?
根据您的程序需要做什么,您可以考虑使用POE,这是一个用于具有用户空间线程的多线程应用程序的Perl框架.它复杂,但优雅且功能强大,可以通过将活动限制在单个Perl解释器线程中来帮助您避免非线程安全模块.
有用的资源入门:
由Matt Sergeant 编写POE演示文稿(从这里开始了解它是什么和做什么)
POE项目页面(很多食谱示例)
此外,还有数百种预构建的POE组件可用于组装到应用程序中.
您始终可以在父级和子级之间使用管道来回传递消息.
pipe my $reader, my $writer; my $pid = fork(); if ( $pid == 0 ) { close $reader; ... } else { close $writer; my $msg_from_child = <$reader>; .... }
不是一种非常舒适的编程方式,但它不应该是"不稳定的".