LINUX.ORG.RU

Почему не работает POSIX::RT::Semaphore


0

0

#!/usr/local/bin/perl
use threads;
use threads::shared;
use POSIX::RT::Semaphore;

$sem = POSIX::RT::Semaphore->init(0, 0);

my $pid = fork;
if ( $pid == 0 )
  {
    $sem->wait;
    print "CODE2\n";
    exit;
  }

print "CODE1\n";
$sem->post;


Я вижу только CODE1
Почему в дочернем процессе блокировка остаётся после того как в родительском сделан post и значение увеличено на 1

Мне надо лишь чтобы CODE1 было выведено
раньше чем CODE2


POSIX семафоры в Линуксе зачаточны, они работают только в тредах. Даже если разместить такой семафор в шареной памяти, спящий процесс не проснется когда другой процесс семафор увеличит.

Die-Hard ★★★★★
()
Ответ на: комментарий от kri

> Тогда как иначе можно решить мою задачу???

Я плохо ориентируюсь в перловых библиотеках. Могу только посоветовать НЕ применять SySV семафоры, даже если они есть: их потом надо будет чистить, и вообще IMHO идеологически неверный путь.

Я бы прокинул пайп от папы к дочке, и пусть дочка спит на блокирующем чтении. Когда надо ее разбудить, папа пусть в пайп посвистит.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

На счёт SysV я не очень понял!
Есть всего два вида семафоров:
  SysV
  POSIX

Если они все плохо работают то как же жить
дальше :)) 

Помоему решение с семафором более красивое
чем с пайпом, но всё равно спасибо за идею!

kri
() автор топика
Ответ на: комментарий от kri

> Если они все плохо работают то как же жить дальше :))

Они хорошо работают. Но POSIX семафоры работают только в тредах, а SysV предназначены для IPC между никак не связанными друг с другом процессами. В твоем случае пайпы IMHO самое красивое решение.

Die-Hard ★★★★★
()
Ответ на: комментарий от Die-Hard

Да, в данном случае pipe очень красиво вписываются. Скажите пожалуйста, Die-Hard, а что вы думаете по поводу синхронизации процессов (неродственных) с использованием flock()? Или использование SysV семафоров более верное решение? Или же можно использовать именованные каналы с такой же целью?

anonymous
()
Ответ на: комментарий от anonymous

2anonymous (*) (25.03.2005 12:32:38):

> а что вы думаете по поводу синхронизации процессов (неродственных) с использованием flock()?

Честно говоря, я никогда не использовал flock(): мне _кажется_ (на самом деле я просто не в курсе), что это -- медленно. К тому же, flock() довольно глючен.

> Или же можно использовать именованные каналы с такой же целью? IMHO (опять же, я лично не пробовал) именованные пайпы должны быть быстрее flock(), но медленнее SysV семафоров.

Я делал бенчмарки -- SysV семафоры показались мне ОЧЕНЬ быстрыми; быстрее всего, что можно еще найти в ядре для синхронизации (в том числе и для родственных процессов -- каюсь, я именно их (SysV семафоры) использую в критических к производительности случаях, потому что быстрые). Быстрее могут быть только userspace прибамбасы типа спинлоков.

Для сихронизации НЕ родственных процессов, конечно, надо использовать SysV семафоры. НО: я не представляю (в рамках Юникса) задачу, в которой потребовалась бы синхронизация между неродственными процессами...

Die-Hard ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.