multithreading - Perl:从并行线程派生
问题描述
下面的代码应该运行 2 个并行线程,每个线程执行 fork(),等待子进程完成,然后线程应该加入(完成)并打印结果。实际上,第一个分叉子进程按预期完成,但第二个子进程挂在 _mutex_lock() 试图退出,因此第二个线程永远不会加入,直到您使用 -9 信号手动杀死第二个子进程。有人可以解释为什么会发生这种情况,以及如何避免这种情况吗?
use strict;
use warnings;
use threads;
use Data::Dumper;
sub Run
{
my $tid = threads->tid();
my $log = {};
$log->{"[$$:$tid]:00"} = "started";
my $pid = fork();
if ($pid == 0)
{
print "In child ($$): started\n";
sleep 3;
print "In child ($$): finished\n";
# system("kill -9 $$"); -- brutal way
exit 0;
}
waitpid($pid, 0);
my $exitCode = $? >> 8;
$log->{"[$$:$tid]:01"} = "finished, code=$exitCode";
return $log;
}
my @threads = ();
foreach (1..2)
{
push @threads, threads->new(sub { return Run() });
}
print Dumper($_->join()) for @threads;
解决方案
推荐阅读
- nuxt.js - 生成页面时为 nuxtServerInit 传递有效负载
- java - 按名称创建内部静态类实例
- apache-spark - Spark在读取文件时如何决定分区数?
- c++ - 如何使用 rapidxml 创建 xml 节点
- javascript - 如何从浏览器中删除所有 cookie
- android - 从 Firebase 存储中下载视频 - 逐块
- javascript - 打字稿导致找不到模块错误
- python - Python中的数据抓取
- c# - ASP.NET Core 3.1 中的证书身份验证实现
- function - 我可以根据不同参数的 _value_ 强制一个参数吗?