检查 IPC 共享锁
Posted
技术标签:
【中文标题】检查 IPC 共享锁【英文标题】:Checking IPC Shareable lock 【发布时间】:2011-11-17 11:05:58 【问题描述】:如何在 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 秒后打印“Got lock in parent”,而我希望它打印“共享资源已锁定”。
【问题讨论】:
【参考方案1】:你想做一个非阻塞锁。锁定调用将立即返回。如果锁可用,则锁调用的返回值为真,您将获得锁。如果返回值为 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";
【讨论】:
你能解释一下吗?这确实奏效了。 “LOCK_EX | LOCK_NB”与“LOCK_EX”有何不同LOCK_NB
是“非阻塞”。如果锁不可用,锁调用立即返回 false。没有这个,锁调用“阻塞” - 等到锁可用后再返回。【参考方案2】:
据我所知,你有一个竞争条件。您假设孩子将在父母检查句柄之前锁定资源。使用您提供的代码,这表明分叉后的 exec 占用子进程的时间不超过父进程在 0 上分支的时间。(这对我来说似乎是明智的。)除非您强制在父进程中休眠,我没有看到你的代码和结果表明有任何问题。
【讨论】:
对不起,这是一个错误,我忘记了父母的睡眠,现在编辑它。这仍然给了我相同的结果。以上是关于检查 IPC 共享锁的主要内容,如果未能解决你的问题,请参考以下文章
35 守护进程 互斥锁 IPC 共享内存 的方式 生产者消费者模型