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.