Хранилище по умолчанию является локальным для потока в D, поэтому между потоками ничего не распределяется, если только оно не помечено как shared
.Если вы пометите переменную как shared
, вы сможете использовать традиционные взаимные исключения и условия, а также синхронизированные объекты и тому подобное для работы с параллелизмом.Однако предпочтительным средством связи между потоками является использование средств передачи сообщений в std.concurrency, и все данные остаются локальными для потока, используя только shared
, когда это необходимо.Все объекты, передаваемые между потоками с использованием std.concurrency, должны передаваться либо по значению, либо быть неизменяемыми, поэтому совместного использования там не происходит, и это полностью потоково-безопасно.Однако в настоящее время может быть немного трудно получить неизменяемый ссылочный тип, который не является массивом (idup
, как правило, облегчает работу с массивами), поэтому может быть немного неприятно передавать что-либо, кроме типов значений илимассивы (хотя мы надеемся, что ситуация улучшится в ближайшее время, когда ошибки компилятора и стандартной библиотеки, связанные с const и неизменяемостью, будут исправлены, и больше кода будет сделано const-правильным).
Теперь, когда передача сообщений в D определенно приведет к очистке,Более безопасный код, чем тот, который вы получили бы в таких языках, как C ++ или Java, он построен на поверх обычных потоков C (например, Linux использует pthreads), поэтому он не имеет вида легких потоковчто делает Erlang, и поэтому работа с несколькими потоками не будет столь же эффективной, как Erlang.
Конечно, я не вижу никакой причины, почему более эффективная система потоков не могла бы быть написана с использованием D, вв какой момент вы могли бы получить эффективность потоков, аналогичную эффективности Erlang, и он, вероятно, мог бы использовать API, аналогичныйв std.concurrency, но все стандартные потоки D основаны на нормальных потоках C, поэтому вам придется делать все это самостоятельно, в зависимости от того, как вы это реализовали, и от того, как именноЛокальные / shared
вещи обрабатываются компилятором и druntime, может быть трудно заставить систему типов обеспечить, чтобы все было локально для потоков с вашими "зелеными" потоками.Боюсь, что я недостаточно знаю, как именно реализован shared
или как работают «зеленые» потоки, чтобы знать наверняка.
Независимо от этого, система передачи сообщений D обязательно приведет к работе с потоками.быть более приятным, чем C ++ или даже Java, но он не предназначен для оптимизации так же, как Erlang.D - это системный язык общего назначения, а не язык, специально разработанный для использования потоков для всего и, следовательно, для их максимально эффективного использования.Большая часть стандартных средств D построена на основе C, поэтому многие ее характеристики эффективности будут аналогичны характеристикам C.