Co nowego w wielowątkowości w Delphi XE?
Widziałem jakiś czas temu ludzi dyskutujących o nowej wielowątkowości w Delphi XE oraz o tym, że Delphi ma pewne "natywne" problemy z powodu sposobu implementacji wielowątkowości. Zalecali też niektóre zewnętrzne biblioteki, aby zastąpić domyślną wielowątkowość Delphi.
Możesz mi wskazać jakąś dokumentację i najpopularniejszą bibliotekę wielowątkową dla Delphi XE? Dzięki
6 answers
Uważam, że wszystkie nowo wprowadzone funkcje zostały już omówione.
Dla części dokumentacji, oto zarchiwizowana Kopia klasycznej książki samouczka Martin Harvey. Wielowątkowość-Sposób Delphi. Po przeczytaniu najprawdopodobniej zdasz sobie sprawę z tego, że nie ma realnej potrzeby tworzenia bibliotek (może poza pulą wątków), pamiętaj, że frameworki nie upraszczają dla Ciebie rzeczy, a także pozbawiają cię kontroli drobnoziarnistej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-11 19:19:45
[można ustawić nazwę wątku: TThread./ Align = "left" / ] (zaimplementowane w D2010 jak zauważył David)
Możesz utworzyć anonimowy wątek (wątek, który wykonuje funkcję anonimową i nie potrzebuje obiektu potomnego tthread): TThread.CreateAnonymousThread.
Delphi threading Framework są omówione tutaj:
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:26
Oprócz tego, co już zostało wspomniane:
- istnieje wrapper
TExternalThread
dla zewnętrznych wątków (dostępny przez właściwość klasyTThread.CurrentThread
). - podczas debugowania w IDE, możesz teraz zamrażać i rozmrażać poszczególne wątki.
- wiele nowych rzeczy w
SyncObjs
unit: wsparcie dla zmiennych warunkowych ,TLightweightEvent
,TLightweightSemaphore
,TSpinLock
,TSpinWait
,TInterlocked
i nie tylko...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-11 15:20:58
Myślę, że "natywne" kwestie, o których mówisz, nie są związane ze sposobem implementacji TThread
, ale z innymi aspektami RTL:
- Menedżer pamięci jest bardzo szybki i dobrze napisany, ale nie skaluje się w sposób liniowy, gdy działa z wieloma równoległymi wątkami na wielu rdzeniach;
- typy zliczane odniesienia (takie jak
string
i tablice dynamiczne ) są zaimplementowane z kodem ASMlock
, aby zliczać odniesienia atomowe (InterlockedDecrement / InterlockedIncrement w x64), który może również źle skalować w aplikacjach wielowątkowych (to znaczy, wszystkie rdzenie zawiesza się podczas wykonywania tego kodu-nawet jeśli nowsze Procesory poczyniły postępy w tym zakresie, implementacja RCU może skalować się lepiej).
Te słabości są wspólne dla wszystkich bibliotek wielowątkowych - nawet OTL ucierpi na tym . Istnieją one od bardzo wczesnych wersji Delphi i nadal istnieją z Delphi XE2. 64 bit implementacja jest podobna (jeszcze wolniejsza), a platforma Mac OS dzieli tę samą implementację.
Zobacz to drugie pytanie o to, jak pisać skalowanie wielowątkowych aplikacji w Delphi.
Szczerze mówiąc, oba powyższe punkty pojawią się tylko w niektórych bardzo specyficznych zastosowaniach.
Więc nie ma się czym martwić o wielowątkowość w Delphi, jeśli znasz te punkty i nie nadużywaj wywołań Menedżera pamięci lub procesu łańcuchowego w Twoim nici.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:45
Gabr prawdopodobnie wspomniał o głównych nowych dodatkach. To, co pozostało, to prawdopodobnie nowe przeciążenia dla TThread.Synchronizuj i TThread.Kolejka, która może teraz wykonywać metody anonimowe.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-11 13:21:15
TThreadedQueue został wprowadzony w XE.
Uważam, że jest to przydatne do przekazywania informacji z wątków roboczych do wątku głównego lub innych wątków konsumenckich. Ostatnia część, mająca wiele wątków konsumenckich, była niestety błędna. Wystąpił błąd w TMonitor, klasie wprowadzonej przez Delphi 2009, używanej do synchronizacji dostępu do kolejki w TThreadedQueue.
To zostało ustalone dla XE2. Zobacz tthreadedqueue-not-capable-of-multiple-consumers
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:43