On Monday, 9 February 2015 at 20:11:09 UTC, Ali Çehreli wrote:
On 02/09/2015 11:46 AM, Ali Çehreli wrote:

> threads normally start one [or] more worker threads and
> send tasks to those threads

Accordingly, the following program uses just three threads:

import std.stdio;
import std.concurrency;
import std.conv;
import core.thread;

struct Terminate
{}

void main() {

    auto square_tid = spawn(&square);

    foreach (int num; 1..100) {
        square_tid.send(num);
        auto square = receiveOnly!string();
        writeln(square);
    }

    square_tid.send(Terminate());
}

void square() {
    auto i = 0;
    bool done = false;
    auto stringWorker = spawn(&stringConverter, ownerTid);

    while (!done) {
        receive (
            (Terminate message) {
                stringWorker.send(message);
                done = true;
            },

            (int num) {
                auto square = num * num;
                writeln("sqaure : Comes in with " ,
                        num , " for " , ++i , " time");
                stringWorker.send(square);
            });
    }
}

void stringConverter(Tid destination) {
    auto i = 0;
    bool done = false;

    while (!done) {
        receive (
            (Terminate message) {
                done = true;
            },

            (int num) {
                auto stringified = num.to!string;

                writeln("string : Comes in with ",
                        num, " for " , ++i , " time");
                destination.send(stringified);
            });
    }
}

Ali

Hi Ali,

Thanks for your book :) I am using it for learning D. I want the stringConverter to send a message to square which in turn messages the main function with string "hello". So are you saying that message is not delivered to square from stringWorker. How does embedding the receive call inside the int in stackoverflow answer receives the message? It seems silly but how can I keep my threads alive to receive messages? Thanks a lot again. Please correct me if I am wrong anywhere.

Reply via email to