Maison >développement back-end >C++ >La boucle foreach est-elle thread-safe lorsqu'elle est utilisée avec des fermetures ?

La boucle foreach est-elle thread-safe lorsqu'elle est utilisée avec des fermetures ?

DDD
DDDoriginal
2025-01-22 07:01:08315parcourir

Is foreach Loop Thread-Safe When Used with Closures?

foreachSé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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn