如何在Perl中使用IPC :: Shareable时检查其他人是否持有锁。 我有以下代码:
my $resource = 0;
my $resource_handle = tie $resource, 'IPC::Shareable', undef , { destroy => 1 };
my $child = fork;
unless ($child) {
$resource_handle -> shlock();
sleep 10;
$resource_handle -> shunlock();
exit(0);
}
sleep 2;
if ($resource_handle -> shlock(LOCK_EX)) {
print "Got lock in parent\n";
$resource_handle -> shunlock();
} else {
print "The shared resource is locked\n";
}
这会在10秒钟后打印“在家中锁定”,而我希望它打印“共享资源被锁定”。
答案 0 :(得分:3)
您想要进行非阻塞锁定。锁定电话将立即返回。如果锁定可用,则锁定调用的返回值将为true,您将获得锁定。如果返回值为false,则其他东西拥有该资源。
if ($resource_handle -> shlock(LOCK_EX | LOCK_NB)) {
print "Got lock in parent\n";
$resource_handle -> shunlock();
} else {
print "The shared resource is locked\n";
}
答案 1 :(得分:0)
从我所看到的,你有一个竞争条件。您假设子项将在父项检查句柄之前锁定资源。使用你给出的代码,这表明fork在使用子进程的时间长于父进程在0上进行分支之后的exec。(这对我来说似乎是明智的。)除非你在父进程中强制睡眠,我没有看到您的代码和结果表明存在任何问题。