D-язык - Thread vs spawn

Я пытаюсь войти в программирование с помощью D, и я столкнулся с чем-то вроде проблемы. Я начал использовать класс core.thread Thread, который обеспечивает поддержку для запуска потока и последующего присоединения к нему текущего потока. D, похоже, хочет, чтобы люди использовали передачу сообщений вместо методов блокировки/синхронизации, поэтому я решил попробовать, но каждый пример передачи сообщений, который я вижу, нуждается в tid, который я, похоже, не могу получить из класса Thread. В примерах кода, которые я вижу в Интернете, на самом деле используется spawn, который возвращает tid вместо использования обертки Thread, а затем вы используете tid для передачи сообщений в Thread. Но теперь, похоже, нет никакого способа присоединиться к потоку, основанному на его тиде! И не только это, но вы, похоже, не можете отменить делегата, что требует от меня добавления ненужного уровня косвенности.

Итак, мой вопрос в первую очередь, почему существуют два совершенно разных вкуса потоковой передачи? И, во-вторых, почему они настолько неполны, когда вместе они обеспечивают в основном все, что вам может понадобиться?

Ответ 1

core.thread предоставляет базовые примитивы низкого уровня для потоковой передачи. std.concurrency использует core.thread внутренне. A tid можно получить только из std.concurrency.spawn.

Итак, мой вопрос в первую очередь, почему существуют два совершенно разных вкуса потоковой передачи?

Вы также можете спросить, почему существуют два способа написания кода, обычный D и встроенный код сборки. Там высокий уровень и низкий уровень.

И, во-вторых, почему они оба настолько неполны, когда вместе они обеспечивают в основном все, что вам может понадобиться?

Они не являются неполными, но ваш многопоточность должен быть разработан для работы в одном или другом. Если std.concurrency допускает произвольный доступ к Thread и тому подобное, гарантии, которые он делает, могут быть не столь сильными.

Чтобы ответить на ваши более конкретные вопросы, требуется function, а не delegate, потому что delegate принимает указатель контекста, который допускает мутацию, которая нарушит некоторые из предположений std.concurrency. Обратите внимание, что spawn не разрешает аргументы, которые имеют изменяемую косвенность, поэтому никакая делегированная вещь не должна шокировать.

И вместо того, чтобы присоединяться, вы должны отправить сообщение "stop" в ваш поток. Опять же, это более высокий уровень и использует конструкции более высокого уровня.