你将如何在C++中实现类似Erlang的发送和接收?

Maa*_*der 10 c++ erlang

实际上,这个问题似乎有两个部分:

  • 如何实现模式匹配?
  • 如何实现发送和接收(即Actor模型)?

对于模式匹配部分,我一直在研究AppProp等各种项目.这些看起来很不错,但无法让它们在g ++的最新版本(4.x)上运行.该菲利克斯语言也似乎支持模式匹配得很好,但不是真正的C++.

至于Actor模型,有现有的实现,如ACT ++和Theron,但我找不到任何东西,只有前者的论文,而后者只是单线程 [见答案].

就个人而言,我已经使用线程和线程安全的消息队列实现了actor.消息是类似哈希的结构,并与许多预处理器宏一起使用以实现简单的模式匹配.

现在,我可以使用以下代码发送消息:

(new Message(this))
    ->set("foo", "bar")
    ->set("baz", 123)
    ->send(recipient);
Run Code Online (Sandbox Code Playgroud)

以下做简单的模式匹配(qDebug并且qPrintable是特定于Qt的):

receive_and_match(m)
    match_key("foo")    { qDebug("foo: %s", qPrintable(m->value("foo").toString())); }
    or_match_key("baz") { qDebug("baz: %d", m->value("baz").toInt()); }
    or_match_ignore
end_receive
Run Code Online (Sandbox Code Playgroud)

然而,这对我来说看起来有些苛刻,而且不是很强大.

你会怎么做?我错过了现有的工作吗?

小智 11

至于Actor模型,有现有的实现,如ACT ++和Theron,但我找不到任何东西,只有前者的论文,而后者只是单线程.

作为Theron的作者,我很好奇为什么你认为它是单线程的?

就个人而言,我已经使用线程和线程安全的消息队列实现了actor

这就是Theron的实施方式.. :-)


172*_*729 4

关于 erlang 的重要事情之一是如何使用这些功能来构建健壮的系统。

发送/接收模型是非共享的,并且是显式复制的。进程本身是轻量级线程。

如果您确实需要 erlang 模型的强大特性,那么最好使用真实的进程和 IPC 而不是线程。

如果您想要健壮的消息传递,尽管您可能最终想要序列化和反序列化内容。尤其是类型安全。

C++ 中的模式匹配并不总是很漂亮,但会有一个很好的模式 - 您最终将创建一个调度程序对象,它使用某种形式的多态性来获得您想要的内容。

尽管如果你不小心,你最终会在管道上得到 xml :)

真的,如果你想要 erlang 模型,你真的想使用 erlang。如果存在速度慢的情况,我相信您可以使用外部功能互联网来增强您的程序。

重新实现部件的问题是您不会获得良好的内聚库和解决方案。您已经拥有的解决方案看起来不再像 C++。