Для определенного моего проекта Perl мне нужно несколько процессов Perl для совместного использования некоторых ресурсов, расположенных на C ++ библиотека. (Не спрашивайте, это не суть вопроса, а только контекст.)
Таким образом, я пытаюсь вникнуть в два «новых» поля в этом контексте: IPC :: Shareable
и обертывание C ++ с помощью SWIG. Кажется, я что-то делаю не так, и вот о чем я хотел бы спросить.
На стороне C ++ я написал небольшой тестовый класс Rectangle
с пустым конструктором, набором
и функцией-членом size
.
Затем я заключил класс в пакет Perl, созданный SWIG , пример
.
На стороне Perl я попробовал, работает ли модуль SWIG, как ожидалось:
use example;
my $testrec = new example::Rectangle;
$testrec->set( 6, 7 );
print $testrec->size() . "\n";
Это печатает «42», как и должно.
Затем я попытался проверить свой способ использования IPC :: Shareable
. Я написал два сценария Perl, один «серверный» и один «клиентский», чтобы протестировать совместное использование ресурсов.
«Сервер»:
use IPC::Shareable;
use example;
# v_ for variable, g_ for (IPC) glue
my $v_array;
my $v_rect;
my %options = ( create => 'yes', exclusive => 0, mode => 0644, destroy => 'yes' );
tie $v_array, 'IPC::Shareable', 'g_array', { %options } or die;
tie $v_rect, 'IPC::Shareable', 'g_rect', { %options } or die;
$v_array = [ "0" ];
$v_rect = new example::Rectangle;
$v_rect->set( 6, 7 );
while ( 1 ) {
print "server array: " . join( " - ", @$v_array ) . "\n";
print "server rect: " . $v_rect->size() . "\n";
sleep 3;
}
«Клиент»:
use IPC::Shareable;
use example;
# v_ for variable, g_ for (IPC) glue
my $v_array;
my $v_rect;
my %options = ( create => 0, exclusive => 0, mode => 0644, destroy => 0 );
tie $v_array, 'IPC::Shareable', 'g_array', { %options } or die;
tie $v_rect, 'IPC::Shareable', 'g_rect', { %options } or die;
my $count = 0;
while ( 1 ) {
print "client array: " . join( " - ", @$v_array ) . "\n";
print "client rect: " . $v_rect->size() . "\n";
push( @$v_array, ++$count );
$v_rect->set( 3, $count );
sleep 3;
}
Запуская сначала «сервер», затем «клиент», я получаю этот вывод для «сервера»:
server array: 0
server rect: 42
server array: 0 - 1
server rect: 42
server array: 0 - 1 - 2
server rect: 42
И этот вывод для "client":
client array: 0
client rect: 0
client array: 0 - 1
client rect: 3
client array: 0 - 1 - 2
client rect: 6
Таким образом, очевидно, что ссылка на массив используется совместно, но клиент не "видит" example :: Rectangle сервера, но работает с (инициализированным нулем) фрагментом мошеннической памяти, который в свою очередь, сервер ничего не знает о ...
У меня есть подозрение, что мне нужно что-то сделать с $ v_rect
, чтобы все работало правильно, но я недостаточно разбираюсь в OO Perl, чтобы знать, что . Кто-нибудь придет на помощь?