- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
对于我的某个 Perl 项目,我需要多个 Perl 进程共享一些位于 C++ 库中的资源。 (别问,这不是这个问题的核心,只是上下文。)
因此,我试图在这种情况下深入研究两个"new"领域:IPC::Shareable
,并使用 SWIG 包装 C++。看来我在那里做错了什么,这就是我想问的问题。
在 C++ 方面,我编写了一个小型测试类 Rectangle
,其中包含一个空构造函数、一个 set
和一个 size
成员函数。
然后我将该类包装在 SWIG 生成的 Perl 包 example
中。
在 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 array: 0
client rect: 0
client array: 0 - 1
client rect: 3
client array: 0 - 1 - 2
client rect: 6
很明显,数组引用得到了共享,但客户端没有“看到”服务器的 example::Rectangle,而是在一 block (零初始化的)流氓内存上工作,而这又是服务器对……一无所知
我怀疑我必须对 $v_rect
做些什么才能使它正常工作,但我对 OO Perl 的了解还不够扎实,不知道该怎么做。有人来救援吗?
最佳答案
您尝试执行的操作不会奏效。您将不得不硬着头皮进行某种形式的消息传递。
我不太记得 SWIG 是如何为 Perl 包装 C(++) 级对象的,但这很可能是通常的、公认的可怕的“整数槽中的指针”策略。在此设置中,它将分配一个 C(++) 对象并将指向它的指针存储在 Perl 标量中。 Perl 对象将是对此标量的祝福引用。当对 Perl 对象的所有引用都消失时,C(++) 对象将由 Perl 类的析构函数显式释放。一种更现代的技术类似于 XS::Object::Magic 模块允许您执行的操作。
但是包装器的细节甚至没有那么重要。重要的是该对象对 Perl 来说是不透明的!对于领带,IPC::Shareable 无论如何都使用了一些过时且坦率地说脆弱的技术。它可能适合也可能不适用于您的 Perl 对象。但是当您共享 Perl 对象时,C(++) 对象将不被共享。怎么可能呢? Perl 对此一无所知。这不可能。
您应该做的是从消息传递和序列化的角度考虑问题。为了序列化您的 C(++) 对象,您需要允许 C 方面的一些合作。查看 Storable 模块提供的用于序列化对象的 Hook 。就消息传递/队列而言,我很喜欢使用 ZeroMQ,它为您提供了一个简单的类似套接字的接口(interface)。
关于c++ - Perl:IPC::Shareable 和 SWIG'ed C++ 对象不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7518181/
For 循环和多个变量和条件。 我正在使用 for 循环来设置源索引和目标索引以复制数组中的项目。 for(int src = 0, dst = 8; src = 0; src ++,
我正在尝试创建一个 2 面的 ggplot 对象,并将它们 grid.arrange 在两列中(grid.arrange 列)。在第二列中,在每个分面成员中,我想插入一个直方图。两列的数据源也不同。到
我正在使用 MS VS2010 和一个名为 Deleaker 的插件来发现我可能错过的任何内存泄漏。它告诉我 fopen_s 行有 2 处内存泄漏,但我没有在该行的任何内容上使用 new 或 mall
java.nio.charset.Charset.forName("utf8").decode解码 的字节序列 ED A0 80 ED B0 80 进入 Unicode 代码点: U+10000
我必须国际化 (i18n) 一个 Django 项目。它结合了许多内部 django 应用程序。它已经部分国际化了,即一些字符串是 _(),但有些是空的。一些模板使用 {% blocktrans %}
什么是EDS和 OD ?它们是如何创建和使用的? OD 是如何介于应用程序和 CAN 之间的?界面? 最佳答案 首先你应该读一点关于CANopen的内容熟悉这些概念。检查www.canopen.de您
我正在浏览 Wikipedia/Restrict , 并发现 The compiler can e.g. rearrange the code, first loading all memory lo
我正在 Linux 中编写一个 bourne shell 脚本,我正在使用 ed 将文本附加到文件的末尾。 我必须使用 ed 来完成这项任务。 我需要附加的文字看起来像这样 Modified on:
考虑以下 IL 代码: .method public static void Main() { ldstr "Starts Here" call voi
我有这样的东西: //html Action 1 Action 1 Action 1 ...
考虑使用 malloc 定义的 (char *) 变量 sTmp, 如果我将另一个变量分配给此 sTmp,通过该变量分配的内存是否会自动释放,或者该内存块是否会保持分配(且无用)直到进程结束? 让我用
我定义了一个不透明的结构和相关的 API,如下所示: typedef struct foo foo; foo *create_foo(...); delete_foo(foo *f); 我无法在我的
使用以下伪 Python 脚本将数据发送到本地套接字: s = socket.socket(AF_UNIX, SOCK_STREAM) s.connect("./sock.sock") s.send(
我有一个正方形比例的MKMapView mainMap,它的宽度等于iPhone屏幕宽度。我使用以下方法将其设为圆形: mainMap.layer.cornerRadius = mainMap.fra
假设您要对所有包含模式的文件进行编辑。例如,将所有“2017”更改为“2018”。存在许多针对 perl、sed 和各种其他的建议。如果 ed 编辑器可以工作的话,它会简单得多。 给定一个文件: $
我在 bash 脚本中使用 ed 来搜索文件; / 命令将显示我不想要的内容。我尝试重定向 >/dev/null 2>&1 但这对我不起作用。 文本文件foo.txt: a b c bash 脚本ba
我正在研究 ed 文本编辑器。 要退出输入模式,用户应输入一个句点 (.)。 假设我想以文本形式输入句点。 我想到了一个解决方法:首先,我插入类似.. 的内容。然后,我将 .. 替换为 .. 但我的方
Rust playground : trait FnBox { fn call_box(self: Box); } impl FnBox for F { fn call_box(sel
我们有多个域指向我们的 Tomcat Web 应用程序,它们都由我们的默认 Host 提供服务: 我需要配置哪个 Valve 模式来查看请求已发送到哪个域(即用户在网络浏览器中输入了哪
我做了一个简单的test(jsbin)与: {a:1} //dummy value var a=1; 然后: alert($("#a").text()); 结果是: 但是 - 使用
我是一名优秀的程序员,十分优秀!