Подтвердить что ты не робот

Что нового в многопоточности в Delphi XE?

Я видел, как некоторое время назад люди обсуждали новую многопоточность в Delphi XE и о том, что Delphi имеет некоторые "родные" проблемы из-за того, как она реализует многопоточность. И они рекомендовали некоторым внешним библиотекам заменить многопоточность Delphi по умолчанию.

Можете ли вы указать мне какую-нибудь документацию и самую популярную многопоточную библиотеку для Delphi XE? Благодаря

4b9b3361

Ответ 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