Что нового в многопоточности в Delphi XE? - PullRequest
24 голосов
/ 11 октября 2011

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

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

Ответы [ 6 ]

26 голосов
/ 11 октября 2011

[Вы можете установить имя потока: TThread.NameThreadForDebugging.] (Реализовано в D2010, как указал Дэвид)

Вы можете создать анонимный поток (поток, который выполняет анонимную функцию и не нуждается в потомке TThreadobject): TThread.CreateAnonymousThread.

Обсуждаются фреймворки Delphi:

15 голосов
/ 11 октября 2011

Кроме того, в дополнение к тому, что уже было упомянуто:

13 голосов
/ 11 октября 2011

Я думаю, что "родные" проблемы, о которых вы говорите, не связаны с тем, как TThread реализован, а с другими аспектами RTL:

  • Менеджер памяти очень быстрый ихорошо написано, но оно не масштабируется линейно при работе с несколькими параллельными потоками на нескольких ядрах;
  • Типы с подсчетом ссылок (такие как string и динамические массивы )реализован с помощью кода операции asm lock для атомарного подсчета ссылок (InterlockedDecrement / InterlockedIncrement в x64), который также может плохо масштабироваться в многопоточных приложениях (то есть все ядра зависают при выполнении этого кода операции - даже если прогрессируют новые процессорыпо этому поводу реализация RCU может масштабироваться лучше.

Эти недостатки характерны для всех многопоточных библиотек - даже OTL пострадает около это .Они существуют с очень ранних версий Delphi и до сих пор существуют с Delphi XE2.64-битная реализация похожа (даже медленнее), и платформа Mac OS имеет ту же реализацию.

Пожалуйста, посмотрите этот другой вопрос SO о том, как писать масштабируемые многопоточные приложения вDelphi.

Если честно, оба приведенных выше пункта появятся только в некоторых очень специфических приложениях.

Так что не стоит беспокоиться о многопоточности в Delphi, если вы знаете эти точкии не злоупотребляйте вызовами менеджера памяти или строковыми процессами в своих потоках.

7 голосов
/ 11 октября 2011

Я полагаю, что все недавно представленные функции уже были рассмотрены.

Для части документации, здесь есть заархивированная копия классического учебника Мартин Харви. Многопоточность - путь Delphi. После прочтения вы, скорее всего, поймете, в чем нет реальной необходимости в каких-либо дополнительных библиотеках (за исключением, возможно, пула потоков), помните, что фреймворки не упрощают вас, а также лишают вас из мелкозернистого контроля.

7 голосов
/ 11 октября 2011

Габр, вероятно, упоминал основные новые дополнения. Осталось, вероятно, новые перегрузки для TThread.Synchronize и TThread.Queue, которые теперь могут выполнять анонимные методы.

4 голосов
/ 11 октября 2011

TThreadedQueue был представлен в XE.

Я считаю это полезным для передачи информации из рабочих потоков в основной поток или другие потребительские потоки.Последняя часть, имеющая несколько потребительских потоков, была, к сожалению, глючной.Была ошибка в TMonitor, классе, представленном Delphi 2009, который использовался для синхронизации доступа к очереди в TThreadedQueue.

Это исправлено для XE2.См. очередь сообщений, не способная к нескольким потребителям

...