Perl: IPC :: Shareable и объект C ++ с SWIG не согласуются

Для определенного моего проекта 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, чтобы знать, что . Кто-нибудь придет на помощь?

5
задан DevSolar 22 September 2011 в 16:25
поделиться