Взамен работы с потоками и выполнения синхронизации вручную, D позволяет использовать обмен сообщениями как средство эксплуатации мощности нескольких ядер. Потоки обмениваются сообщениями - произвольными значениями - для распределения работы и самосинхронизации. Согласно такому дизайну, между потоками нет разделяемых данных, что позволяет избежать проблем, часто встречающихся при организации многопоточности.
Все функции, реализующие обмен сообщениями в D,
находятся в модуле std.concurrency
.
spawn
создаёт новый поток на основе пользовательской
функции:
auto threadId = spawn(&foo, thisTid);
thisTid
- переменная, встроенная в std.concurrency
,
это идентификатор текущего потока, необходимый для обмена сообщениями.
spawn
первым параметром принимает функцию, а через дополнительные
параметры передаются аргументы этой функции.
void foo(Tid parentTid) {
receive(
(int i) { writeln("An ", i, " was sent!"); }
);
send(parentTid, "Done");
}
Функция receive
- своего рода switch
-case
,
она распределяет значения, полученные от других потоков,
между переданными ей делегатами
, в зависимости от
типа полученного значения.
Чтобы послать сообщение определённому потоку, используйте
функцию send
и идентификатор потока:
send(threadId, 42);
receiveOnly
можно использовать для получения сообщений
строго определённого типа:
string text = receiveOnly!string();
assert(text == "Done");
Семейство функций receive
блокирует поток до тех пор,
пока что-либо не будет передано в его почтовый ящик.