这是我的代码的一部分,它并行编译了一些项目:
#main:#
our $sem = Thread::Semaphore->new();
for ($i = 0; $i < $cores_num-1; $i++)
{
# Generating process
local $curr_pid = fork ();
# Child
if ($curr_pid == 0)
{
compiling_process($i,*REPORT);
exit(0);
}
# Parent
elsif (abs($curr_pid) > 10)
{
sleep (1);
$running_processes++;
}
# Error
else
{
print "Error while forking!! \n";
exit (0);
}
}
# parent process:
compiling_process($i,*REPORT);
# Wait:
while ($running_processes > 0)
{
$kid = 0;
$kid = waitpid(-1,WNOHANG);
if (abs($kid) > 10)
{
$running_processes--;
}
sleep (1);
}
sub compiling_process{
local $id = $_[0];
*REPORT = $_[1];
# Run until all targets are built:
while (1)
{
$sem->down();
##critical section
$sem->up();
}
}
此代码用于并行编译。在运行此代码时 - 有时我会同时在关键部分内看到 2 个内核!(代码运行良好,所有项目都在构建中,但我必须解决这个问题..它会浪费时间 + 打印错误)我有点绝望,因为我不知道我做错了什么。在函数中使用信号量是错误的吗?(“子编译过程”)
任何帮助,将不胜感激!非常感谢。