Quoi de neuf en multithreading en Delphi XE?
j'ai vu il y a quelque temps des gens discuter du nouveau multithreading dans Delphi XE et du fait que Delphi a quelques problèmes "natifs" en raison de la façon dont il met en œuvre le multithreading. Et ils recommandaient certaines bibliothèques externes pour remplacer le multithreading Delphi par défaut.
pouvez-vous me montrer de la documentation et la bibliothèque multithreading la plus populaire pour Delphi XE? Merci
6 réponses
je crois que toutes les fonctionnalités nouvellement introduites étaient déjà couvertes.
pour la partie documentation, voici une copie archivée sur classic tutorial book Martin Harvey. Le Multithreading - Delphi. après la lecture, vous réaliserez très probablement ce qu'il n'y a pas besoin de bibliothèques contribuées (sauf, peut-être, le pool de fils), rappelez-vous, les cadres ne simplifient pas les choses pour vous, ils vous privent également de la fine-grain contrôle.
[vous pouvez définir le nom du fil: TThread.NameThreadForDebugging.] (mis en œuvre en 2010, comme David L'a souligné)
vous pouvez créer le fil anonyme (un fil qui exécute la fonction anonyme et n'a pas besoin d'un objet descendant TThread): TThread.CreateAnonymousThread.
Delphi filetage cadres sont abordés ici:
aussi, en plus de ce qui a déjà été mentionné:
- il y a
TExternalThread
wrapper pour filetage externe (accessible viaTThread.CurrentThread
des propriétés de la classe). - pendant le débogage dans L'IDE, vous pouvez maintenant freeze and thaw threads individuels.
- beaucoup de nouveautés dans
SyncObjs
unité: support pour variables de condition ,TLightweightEvent
,TLightweightSemaphore
,TSpinLock
,TSpinWait
,TInterlocked
et plus encore...
je pense que les questions" autochtones " dont vous parlez ne sont pas liées à la façon dont TThread
est mis en œuvre, mais à d'autres aspects de la RTL:
- le gestionnaire de mémoire est très rapide et bien écrit, mais il ne parvient pas à se dimensionner de manière linéaire lorsqu'il fonctionne avec un certain nombre de threads concurrents sur plusieurs cœurs; Les types de référence comptés
- (comme
string
et dynamic arrays ) sont mis en œuvre avec un asmlock
opcode pour avoir un comptage de référence atomique (décrément enclenché/incrément enclenché dans x64), qui peut également se dimensionner mal sur les applications multi-threadées (c'est - à-dire, tous les noyaux gèlent lorsque cet opcode est exécuté-même si de nouveaux CPU ont fait des progrès à ce sujet, une implémentation RCU peut se dimensionner mieux).
ces faiblesses sont communes à toutes les bibliothèques multi-thread - même OTL souffriront environ ce . Ils existent depuis les premières versions de Delphi, et sont toujours là avec Delphi XE2. L'implémentation 64 bits est similaire (encore plus lente), et la plateforme Mac OS partage la même implémentation.
s'il vous Plaît voir ce autres DONC, la question sur la façon d'écrire de mise à l'échelle applications multi-thread en Delphi.
pour être honnête, les deux points ci-dessus apparaîtront seulement sur une sorte très spécifique de application.
il n'y a donc rien à craindre du multi-threading dans Delphi, si vous connaissez ces points, et n'abusez pas des appels de gestionnaire de mémoire ou du processus de chaîne dans vos threads.
gabr a probablement mentionné les principales nouvelles additions. Ce qui a probablement été laissé est les nouvelles surcharges pour TThread.Synchronisez et TThread.File d'attente qui peut maintenant exécuter les méthodes anonymes.
TThreadedQueue a été introduit dans le XE.
je le trouve utile pour transmettre des informations des threads ouvriers au thread principal ou d'autres threads de consommation. La dernière partie, ayant plusieurs fils de consommation, était buggy malheureusement. Il y avait un bug dans TMonitor, une classe introduite par Delphi 2009, utilisée pour synchroniser l'accès à la file D'attente dans TThreadedQueue.
cette valeur a été fixée pour XE2. Voir tthreadedqueue-pas-capable-de-plusieurs-consommateurs