检查 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 共享内存 的方式 生产者消费者模型

python 并发编程 锁 / 信号量 / 事件 / 队列(进程间通信(IPC)) /生产者消费者模式

IPC概述

互斥锁 IPC 生产者消费者

第1章 简介

IPC:共享内存终止进程通知