Veuillez noter que vous pouvez faire essentiellement tout dans delphi unthreadsafe. Alors que d'autres mentionnent des problèmes d'alignement sur booléen, cela cache en quelque sorte le vrai problème.
Oui, vous pouvez lire un booléen dans n'importe quel thread et écrire dans un booléen dans n'importe quel thread s'il est correctement aligné. Mais la lecture d'un booléen que vous changez n'est pas nécessairement "thread safe" de toute façon. Supposons que vous ayez défini un booléen sur true lorsque vous avez mis à jour un nombre afin qu'un autre thread lise le nombre.
if NumberUpdated then
begin
LocalNumber = TheNumber;
end;
En raison de l'optimisation du processeur fait leNombre peut être lu avant NumberUpdated est lu, donc vous pouvez obtenir l'ancienne valeur de leNombre eventhough vous mis à jour NumberUpdated dernier.
Aka, votre code peut devenir:
temp = TheNumber;
if NumberUpdated the
begin
LocalNumber = temp;
end;
IMHO, une règle de base:
"Reads sont thread-safe Rédige ne sont pas thread-safe."
Donc, si vous allez faire une écriture protéger les données avec la synchronisation partout vous lisez la valeur tandis qu'une écriture peut se produire potentiellement se produire. En revanche, si vous ne lisez et n'écrivez qu'une valeur dans un thread, le thread est sûr. Vous pouvez donc faire une grande partie de l'écriture dans un emplacement temporaire, puis synchroniser une mise à jour des données de l'application.
Bonus texte de présentation:
La VCL est pas thread-safe. Gardez toutes les modifications de choses ui dans le fil principal. Gardez la création de toutes les choses ui dans le fil principal aussi.
De nombreuses fonctions ne sont pas sécurisées par les threads, alors que d'autres le sont, cela dépend souvent des appels winapi sous-jacents.
Je ne pense pas qu'une "liste" serait utile car "thread safe" peut signifier beaucoup de choses.
+1, très bons points. Pour tous ceux qui sont intéressés, consultez par exemple http://en.wikipedia.org/wiki/Memory_barrier et les informations liées. – mghie