foreach
Sécurité des fils des boucles et des fermetures
Assurer la sécurité du fil nécessite une attention particulière lors de l'utilisation de foreach
boucles et fermetures. Dans le scénario que vous décrivez, il existe deux extraits de code qui diffèrent dans la manière dont ils gèrent les références aux objets Foo dans les fermetures.
Le premier fragment passe directement la référence :
<code class="language-c#">foreach (Foo f in ListOfFoo) { Thread thread = new Thread(() => f.DoSomething()); threads.Add(thread); thread.Start(); }</code>
Cette approche est dangereuse car la même f
référence est partagée par tous les fils de discussion. Cela signifie que différents threads peuvent accéder et modifier le même objet Foo, conduisant à un comportement imprévisible.
Pour garantir la sécurité des threads, vous devez créer une copie de la référence à l'intérieur de la boucle, comme indiqué dans le deuxième extrait :
<code class="language-c#">foreach (Foo f in ListOfFoo) { Foo f2 = f; Thread thread = new Thread(() => f2.DoSomething()); threads.Add(thread); thread.Start(); }</code>
En créant une nouvelle f2
variable à l'intérieur de la boucle, chaque thread possède sa propre copie de la référence à l'objet Foo. Cela garantit que chaque thread fonctionne sur un objet unique, évitant ainsi les conditions de concurrence critique et la corruption potentielle des données.
Remarque : Ce problème n'est pas propre au threading. Le même problème se pose lors de l'utilisation de fermetures dans des opérations asynchrones ou des gestionnaires d'événements, et une attention particulière est requise pour éviter tout comportement inattendu et maintenir l'intégrité des données.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!