检查IPC可共享锁

时间:2011-11-17 11:05:58

标签: perl ipc

如何在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秒钟后打印“在家中锁定”,而我希望它打印“共享资源被锁定”。

2 个答案:

答案 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。(这对我来说似乎是明智的。)除非你在父进程中强制睡眠,我没有看到您的代码和结果表明存在任何问题。