Что нового в многопоточности в Delphi XE?
Я видел, как некоторое время назад люди обсуждали новую многопоточность в Delphi XE и о том, что Delphi имеет некоторые "родные" проблемы из-за того, как она реализует многопоточность. И они рекомендовали некоторым внешним библиотекам заменить многопоточность Delphi по умолчанию.
Можете ли вы указать мне какую-нибудь документацию и самую популярную многопоточную библиотеку для Delphi XE?
Благодаря
Ответы
Ответ 1
Я полагаю, что все недавно появившиеся функции уже были рассмотрены.
Для части документации здесь находится архивная копия в классической учебной книге Мартин Харви. Многопоточность - путь Delphi. После прочтения вы, скорее всего, поймете, что нет никакой реальной потребности в каких-либо библиотеках (за исключением, может быть, пула потоков), помните, что фреймворки не упрощают вас, они также лишают вы от мелкозернистого контроля.
Ответ 2
[Вы можете установить имя потока: TThread.NameThreadForDebugging.] (реализовано в D2010, как указал Дэвид)
Вы можете создать анонимный поток (поток, который выполняет анонимную функцию и не нуждается в объекте потомков TThread): TThread.CreateAnonymousThread.
Фрагменты потоков Delphi обсуждаются здесь:
Ответ 3
Кроме того, что уже упоминалось:
Ответ 4
Я думаю, что "родные" проблемы, о которых вы говорите, не связаны с тем, как реализуется TThread
, но и с другими аспектами RTL:
- Диспетчер памяти очень быстрый и хорошо написан, но он не может масштабироваться линейным способом при работе с несколькими параллельными потоками на нескольких ядрах;
- Сопоставленные по ссылке типы (например,
string
и динамические массивы) реализуются с помощью кода операции asm lock
для подсчета атомных ссылок (InterlockedDecrement/InterlockedIncrement в x64), что также может сильно ухудшиться в многопоточных приложениях (что, все ядра зависают, когда этот код операции выполняется - даже если новые процессоры достигли этого, RCU может масштабироваться лучше).
Эти слабости являются общими для всех многопоточных библиотек - даже OTL будет страдать от это. Они существуют с очень ранних версий Delphi и все еще существуют с Delphi XE2. 64-битная реализация похожа (даже медленнее), а платформа Mac OS использует ту же самую реализацию.
См. этот другой вопрос SO о том, как писать масштабирование многопоточных приложений в Delphi.
Честно говоря, оба вышеописанных пункта будут отображаться только в некоторых конкретных приложениях.
Поэтому не стоит беспокоиться о многопоточности в Delphi, если вы знаете эти моменты и не злоупотребляете вызовами диспетчера памяти или строковыми процессами в ваших потоках.
Ответ 5
gabr, вероятно, упоминал основные новые дополнения. Вероятно, это были новые перегрузки для TThread.Synchronize и TThread.Queue, которые теперь могут выполнять анонимные методы.
Ответ 6
В XE был введен TThreadedQueue.
Я считаю это полезным для передачи информации из рабочих потоков в основной поток или другие потоки пользователей. К сожалению, последняя часть, имеющая несколько потребительских потоков, была неудачной. В TMonitor появился класс, введенный Delphi 2009, используемый для синхронизации доступа к очереди в TThreadedQueue.
Это исправлено для XE2. См. tthreadedqueue-not-capable-of-multiple-consumers