Menu

Обмен сообщениями

Взамен работы с потоками и выполнения синхронизации вручную, 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 блокирует поток до тех пор, пока что-либо не будет передано в его почтовый ящик.

Подробнее

rdmd playground.d