Проверка блокировки IPC - PullRequest
       1

Проверка блокировки IPC

1 голос
/ 17 ноября 2011

Как я могу проверить, удерживается ли блокировка кем-то еще при использовании IPC :: Shareable в perl. У меня есть следующий код:

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 ]

3 голосов
/ 17 ноября 2011

Вы хотите сделать неблокирующую блокировку. Вызов блокировки вернется сразу. Если блокировка была доступна, возвращаемое значение вызова блокировки будет истинным, и вы получите блокировку. Если возвращаемое значение равно 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";
}
0 голосов
/ 17 ноября 2011

Из того, что я вижу, у вас есть состояние гонки. Вы предполагаете, что дочерний элемент заблокирует ресурс до того, как родительский объект проверит дескриптор. В коде, который вы дали, это указывает не больше, чем на exec после того, как fork принимает дочерний процесс дольше, чем родительский процесс для перехода на 0. (И это мне кажется разумным.) Если только вы не заставите спать в родительском процессе Я не вижу, чтобы ваш код и ваши результаты указывали на какие-либо проблемы.

...