Troca de Mensagens

Em vez de lidar com threads e fazer a sincronização você mesmo, o D permite usar a troca de mensagens como um meio para aproveitar a potência de vários núcleos. As threads se comunicam com mensagens, que são valores arbitrários, para distribuir trabalho e sincronizar-se. Eles não compartilham dados por padrão, o que evita os problemas comuns de multi-threading.

Todas as funções que implementam a troca de mensagens em D podem ser encontradas no módulo std.concurrency módulo. O spawn cria uma nova thread com base em uma função definida pelo usuário:

auto threadId = spawn(&foo, thisTid);

thisTid faz parte do std.concurrency e faz referência a thread atual, que é necessário para a troca de mensagens. spawn recebe uma função como primeiro parâmetro e parâmetros adicionais para essa função como argumentos.

void foo(Tid parentTid) {
    receive(
      (int i) { writeln("An ", i, " was sent!"); }
    );
    
    send(parentTid, "Done");
}

A função receive é como um switch-case e despacha os valores que recebe de outras threads para os delegates enviados, dependendo do tipo de valor recebido.

Para enviar uma mensagem a uma thread específico, use a função send e seu identificador:

send(threadId, 42);

O receiveOnly pode ser usado para receber apenas um tipo especificado:

string text = receiveOnly!string();
assert(text == "Done");

As funções da família receive bloqueiam até que algo tenha sido enviado para a caixa de correio da thread.

Maiores detalhes

rdmd playground.d