Help with Concurrency

bertg via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Nov 3 15:16:57 PST 2015


I am having trouble with a simple use of concurrency.

Running the following code I get 3 different tid's, multiple 
"sock in" messages printed, but no receives. I am supposed to get 
a "received!" for each "sock in", but I am getting hung up on 
"receiving...".

Am I misusing or misunderstanding the use of mailboxes?

===

class Connection {
     Reactor reactor;
     WebSocket webSocket;

     this(Reactor r, WebSocket ws)
     {
         reactor = r;
         webSocket = ws;

         messageLoop();
     }

     void messageLoop()
     {
         std.concurrency.Tid tid = std.concurrency.thisTid();
         writeln("tid 1 ~ " ~ 
to!string(std.concurrency.thisTid()));
         writeln("tid 2 ~ " ~ 
to!string(std.concurrency.thisTid()));
         writeln("tid 3 ~ " ~ 
to!string(std.concurrency.thisTid()));

         // deal with websocket messages
         spawn(&handleConnectionWebSocket, tid, cast(shared) 
webSocket);
         // deal with pub/sub
         //spawn();

         while (true) {
             writeln("receiving...");
             std.concurrency.receive(
                 (string msg) {
                     writeln("conn: received ws message: " ~ msg);
                 }
             );
             writeln("received!");
         }
     }
}
void handleConnectionWebSocket(std.concurrency.Tid caller, shared 
WebSocket ws)
{
     auto sock = cast(WebSocket) ws;
     while (sock.connected) {
         writeln("sock in");
         auto msgIn = sock.receiveText();
         std.concurrency.send(caller, msgIn);
     }
}


More information about the Digitalmars-d-learn mailing list