Boost logo

Boost :

Subject: [boost] Is there any interest in a library for actor programming?
From: Charousset, Dominik (Dominik.Charousset_at_[hidden])
Date: 2013-05-17 17:26:24


Hi,

is there any interest in a library for actor programming?

The library we've developed is a C++11 open source library named "libcppa". It is currently released under LGPL2, but re-releasing the library under the boost license is not an issue. You'll find all important links and ressources either under http://libcppa.org or on the GitHub project page: https://github.com/Neverlord/libcppa, including a user manual as HTML or PDF. We've also submitted a paper to the C++Now conference.

What is actor programming? For those of you who aren't yet familiar with the actor model: actors basically represent tasks or services that communicate via message passing. In libcppa, actors are very lightweight (you can spawn literally millions of them) and scheduled cooperatively using a thread pool (although actors are allowed to opt-out of the cooperative scheduling). Some of the main strengths of this programming paradigm are: (1) network transparency, (2) race conditions are avoided by design, (3) a strong failure model that enables developers to build reliable distributed systems, and (4) the actor model addresses both concurrency (multiple actors on one host) and distribution (any number of actors on any number of hosts).

Here's the classical hello world example:

----------------------------------------------------------------------------------
#include <string>
#include <iostream>
#include "cppa/cppa.hpp"

using namespace std;
using namespace cppa;

void mirror() {
  // wait for messages
  become (
    // invoke this lambda expression if we receive a string
    on_arg_match >> [](const string& what) {
      // prints "Hello World!" via aout (thread-safe cout wrapper)
      aout << what << endl;
      // replies "!dlroW olleH"
      reply(string(what.rbegin(), what.rend()));
      // terminates this actor ('become' otherwise loops forever)
      self->quit();
    }
  );
}

void hello_world(const actor_ptr& buddy) {
  // send "Hello World!" to our buddy ...
  sync_send(buddy, "Hello World!").then(
    // ... and wait for a response
    on_arg_match >> [](const string& what) {
      // prints "!dlroW olleH"
      aout << what << endl;
    }
  );
}

int main() {
  // create a new actor that calls 'mirror()'
  auto mirror_actor = spawn(mirror);
  // create another actor that calls 'hello_world(mirror_actor)'
  spawn(hello_world, mirror_actor);
  // wait until all other actors we have spawned are done
  await_all_others_done();
  // run cleanup code before exiting main
  shutdown();
}
----------------------------------------------------------------------------------

A message is simply a tuple of values that is pattern matched at the receiver. For example, " on_arg_match >> [](const string& what) {...}" defines a message handler that is called whenever a tuple with one single string element arrives. "on_arg_match" simply defines a pattern that matches the signature of the given lambda.

Please have a look at the examples folder on GitHub (https://github.com/Neverlord/libcppa/tree/master/examples) or at the user manual (http://neverlord.github.io/libcppa/manual/) if you want to see more examples.

Best regards,
Dominik Charousset


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk