Maison développement back-end Tutoriel C#.Net Comment gérer les problèmes et solutions de synchronisation des threads et d'accès simultané dans le développement C#

Comment gérer les problèmes et solutions de synchronisation des threads et d'accès simultané dans le développement C#

Oct 08, 2023 am 09:55 AM
解决方法 线程同步 并发访问

Comment gérer les problèmes et solutions de synchronisation des threads et daccès simultané dans le développement C#

Comment gérer les problèmes et solutions de synchronisation des threads et d'accès simultané dans le développement C#

Avec le développement des systèmes informatiques et des processeurs, la popularité des processeurs multicœurs rend le calcul parallèle et la programmation multithread très importants. Dans le développement C#, les problèmes de synchronisation des threads et d’accès simultané sont des défis auxquels nous sommes souvent confrontés. Ne pas gérer correctement ces problèmes peut entraîner de graves conséquences telles qu'une course aux données (Data Race), une impasse (Deadlock) et un conflit de ressources (Resource Contention). Par conséquent, cet article expliquera comment gérer les problèmes de synchronisation des threads et d’accès simultané dans le développement C#, ainsi que les solutions correspondantes, et joindra des exemples de code spécifiques.

  1. Problème de synchronisation des threads

Dans la programmation multithread, la synchronisation des threads fait référence au processus de coordination des opérations entre plusieurs threads dans un certain ordre. Lorsque plusieurs threads accèdent aux ressources partagées en même temps, des incohérences de données ou d'autres résultats inattendus peuvent se produire si une synchronisation appropriée n'est pas effectuée. Pour les problèmes de synchronisation des threads, les solutions suivantes sont courantes :

1.1. Verrouillage mutex

Un verrou mutex (Mutex) est une construction de synchronisation qui fournit un mécanisme qui permet à un seul thread d'accéder aux ressources partagées en même temps. En C#, vous pouvez utiliser le mot-clé lock pour implémenter un verrou mutex. Voici un exemple de code pour un verrou mutex : lock关键字来实现互斥锁。下面是一个互斥锁的示例代码:

class Program
{
    private static object lockObj = new object();
    private static int counter = 0;

    static void Main(string[] args)
    {
        Thread t1 = new Thread(IncrementCounter);
        Thread t2 = new Thread(IncrementCounter);

        t1.Start();
        t2.Start();

        t1.Join();
        t2.Join();

        Console.WriteLine("Counter: " + counter);
    }

    static void IncrementCounter()
    {
        for (int i = 0; i < 100000; i++)
        {
            lock (lockObj)
            {
                counter++;
            }
        }
    }
}
Copier après la connexion

在上面的示例中,我们创建了两个线程t1t2,它们执行的都是IncrementCounter方法。通过lock (lockObj)来锁定共享资源counter,确保只有一个线程能够访问它。最后输出的Counter的值应为200000

1.2. 信号量

信号量(Semaphore)是一种同步构造,它用于控制对共享资源的访问数量。信号量可以用来实现对资源的不同程度的限制,允许多个线程同时访问资源。在C#中,可以使用Semaphore类来实现信号量。下面是一个信号量的示例代码:

class Program
{
    private static Semaphore semaphore = new Semaphore(2, 2);
    private static int counter = 0;

    static void Main(string[] args)
    {
        Thread t1 = new Thread(IncrementCounter);
        Thread t2 = new Thread(IncrementCounter);
        Thread t3 = new Thread(IncrementCounter);

        t1.Start();
        t2.Start();
        t3.Start();

        t1.Join();
        t2.Join();
        t3.Join();

        Console.WriteLine("Counter: " + counter);
    }

    static void IncrementCounter()
    {
        semaphore.WaitOne();

        for (int i = 0; i < 100000; i++)
        {
            counter++;
        }

        semaphore.Release();
    }
}
Copier après la connexion

在上面的示例中,我们创建了一个含有两个许可证的信号量semaphore,它允许最多两个线程同时访问共享资源。如果信号量的许可证数已经达到上限,则后续的线程需要等待其他线程释放许可证。最后输出的Counter的值应为300000

  1. 并发访问问题

并发访问是指多个线程同时访问共享资源的情况。当多个线程同时读取和写入同一内存位置时,可能会产生不确定的结果。为了避免并发访问问题,以下是常见的解决方法:

2.1. 读写锁

读写锁(Reader-Writer Lock)是一种同步构造,它允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。在C#中,可以使用ReaderWriterLockSlim类来实现读写锁。下面是一个读写锁的示例代码:

class Program
{
    private static ReaderWriterLockSlim rwLock = new ReaderWriterLockSlim();
    private static int counter = 0;

    static void Main(string[] args)
    {
        Thread t1 = new Thread(ReadCounter);
        Thread t2 = new Thread(ReadCounter);
        Thread t3 = new Thread(WriteCounter);

        t1.Start();
        t2.Start();
        t3.Start();

        t1.Join();
        t2.Join();
        t3.Join();

        Console.WriteLine("Counter: " + counter);
    }

    static void ReadCounter()
    {
        rwLock.EnterReadLock();

        Console.WriteLine("Counter: " + counter);

        rwLock.ExitReadLock();
    }

    static void WriteCounter()
    {
        rwLock.EnterWriteLock();

        counter++;

        rwLock.ExitWriteLock();
    }
}
Copier après la connexion

在上面的示例中,我们创建了两个读线程t1t2以及一个写线程t3。通过rwLock.EnterReadLock()rwLock.EnterWriteLock()来锁定共享资源counter,确保只有一个线程能够进行写操作,但允许多个线程进行读操作。最后输出的Counter的值应为1

2.2. 并发集合

在C#中,为了方便处理并发访问问题,提供了一系列的并发集合类。这些类可以在多线程环境中安全地进行读取和写入操作,从而避免了对共享资源的直接访问问题。具体的并发集合类包括ConcurrentQueueConcurrentStackConcurrentBagConcurrentDictionary等。以下是一个并发队列的示例代码:

class Program
{
    private static ConcurrentQueue<int> queue = new ConcurrentQueue<int>();

    static void Main(string[] args)
    {
        Thread t1 = new Thread(EnqueueItems);
        Thread t2 = new Thread(DequeueItems);

        t1.Start();
        t2.Start();

        t1.Join();
        t2.Join();
    }

    static void EnqueueItems()
    {
        for (int i = 0; i < 100; i++)
        {
            queue.Enqueue(i);
            Console.WriteLine("Enqueued: " + i);
            Thread.Sleep(100);
        }
    }

    static void DequeueItems()
    {
        int item;

        while (true)
        {
            if (queue.TryDequeue(out item))
            {
                Console.WriteLine("Dequeued: " + item);
            }
            else
            {
                Thread.Sleep(100);
            }
        }
    }
}
Copier après la connexion

在上面的示例中,我们使用ConcurrentQueue类实现了一个并发队列。线程t1往队列中不断添加元素,线程t2从队列中不断取出元素。由于ConcurrentQueuerrreee

Dans l'exemple ci-dessus, nous avons créé deux threads t1 et t2, qui exécutent tous deux IncrementCounter<.> méthode. Utilisez <code>lock (lockObj) pour verrouiller la ressource partagée counter afin de garantir qu'un seul thread peut y accéder. La valeur de sortie finale de Counter doit être 200000.

1.2. Sémaphore

Le sémaphore est une construction de synchronisation utilisée pour contrôler le nombre d'accès aux ressources partagées. Les sémaphores peuvent être utilisés pour implémenter différents degrés de restrictions sur les ressources, permettant à plusieurs threads d'accéder aux ressources en même temps. En C#, vous pouvez utiliser la classe Semaphore pour implémenter des sémaphores. Voici un exemple de code pour un sémaphore : 🎜rrreee🎜Dans l'exemple ci-dessus, nous créons un sémaphore semaphore avec deux licences, qui permet à jusqu'à deux threads d'accéder simultanément à la ressource partagée. Si le nombre de licences de sémaphore a atteint la limite supérieure, les threads suivants doivent attendre que d'autres threads libèrent la licence. La valeur de sortie finale de Counter doit être 300000. 🎜
    🎜Problème d'accès simultané🎜🎜🎜L'accès simultané fait référence à la situation dans laquelle plusieurs threads accèdent à des ressources partagées en même temps. Lorsque plusieurs threads lisent et écrivent simultanément dans le même emplacement mémoire, des résultats indéterminés peuvent se produire. Pour éviter les problèmes d'accès simultané, voici les solutions courantes : 🎜🎜2.1. Read-Writer Lock 🎜🎜Read-Writer Lock (Reader-Writer Lock) est une construction de synchronisation qui permet à plusieurs threads de lire des ressources partagées en même temps, mais Autorise uniquement un thread à écrire sur une ressource partagée. En C#, vous pouvez utiliser la classe ReaderWriterLockSlim pour implémenter des verrous en lecture-écriture. Voici un exemple de code pour un verrou en lecture-écriture : 🎜rrreee🎜Dans l'exemple ci-dessus, nous avons créé deux threads de lecture t1 et t2 et un fil d'écriture t3. Verrouillez la ressource partagée counter via rwLock.EnterReadLock() et rwLock.EnterWriteLock() pour garantir qu'un seul thread peut effectuer des opérations d'écriture, mais autoriser plusieurs threads à effectuer des opérations de lecture. La valeur de sortie finale de Counter doit être 1. 🎜🎜2.2. Collections simultanées🎜🎜En C#, afin de faciliter la gestion des problèmes d'accès simultané, une série de classes de collections simultanées sont fournies. Ces classes peuvent effectuer en toute sécurité des opérations de lecture et d'écriture dans un environnement multithread, évitant ainsi le problème de l'accès direct aux ressources partagées. Les classes de collection simultanées spécifiques incluent ConcurrentQueue, ConcurrentStack, ConcurrentBag, ConcurrentDictionary, etc. Voici un exemple de code pour une file d'attente simultanée : 🎜rrreee🎜Dans l'exemple ci-dessus, nous avons implémenté une file d'attente simultanée à l'aide de la classe ConcurrentQueue. Le thread t1 ajoute continuellement des éléments à la file d'attente et le thread t2 supprime continuellement des éléments de la file d'attente. Étant donné que la classe ConcurrentQueue fournit un mécanisme de synchronisation interne, aucune opération de verrouillage supplémentaire n'est requise pour garantir la sécurité de la concurrence. Les éléments générés dans chaque boucle peuvent être entrelacés, ce qui est dû au fait que plusieurs threads lisent et écrivent la file d'attente en même temps. 🎜🎜Résumé🎜🎜Dans le développement C#, les problèmes de synchronisation des threads et d'accès simultané sont ce sur quoi nous devons nous concentrer. Pour résoudre ces problèmes, cet article présente les solutions courantes, notamment les mutex, les sémaphores, les verrous en lecture-écriture et les collections simultanées. Dans le développement réel, nous devons choisir des mécanismes de synchronisation et des collections de concurrence appropriés en fonction de situations spécifiques pour garantir l'exactitude et les performances des programmes multithread. 🎜

    J'espère que grâce à l'introduction et aux exemples de code de cet article, les lecteurs pourront mieux comprendre les méthodes de gestion des problèmes de synchronisation des threads et d'accès simultané dans le développement C#, et les appliquer dans la pratique. Il est également important que les développeurs examinent attentivement l'interaction entre les threads lors de l'exécution d'une programmation multithread afin d'éviter d'éventuelles conditions de concurrence et autres problèmes, améliorant ainsi la fiabilité et les performances du programme.

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Guide d'accès à l'entrée du site officiel Deepseek résolvez les problèmes courants qui ne peuvent pas être connectés Guide d'accès à l'entrée du site officiel Deepseek résolvez les problèmes courants qui ne peuvent pas être connectés Feb 19, 2025 pm 04:30 PM

Deepseek est une plate-forme qui offre un accès au réseau profond anonyme. Pour accéder à son site Web officiel, veuillez utiliser le lien de portail officiel fourni. Si vous rencontrez des problèmes pendant la connexion, cela peut être dû aux raisons suivantes: le navigateur est obsolète, les informations d'identification sont incorrectes, la connexion est bloquée, la maintenance ou le compte est désactivé. Les questions fréquemment posées comprennent: la sécurité et la légalité de Deepseek, et comment se connecter avec l'équipe d'assistance.

Comment résoudre le problème des serveurs occupés pour Deepseek Comment résoudre le problème des serveurs occupés pour Deepseek Mar 12, 2025 pm 01:39 PM

Deepseek: Comment gérer l'IA populaire qui est encombré de serveurs? En tant qu'IA chaude en 2025, Deepseek est gratuit et open source et a une performance comparable à la version officielle d'Openaio1, qui montre sa popularité. Cependant, une concurrence élevée apporte également le problème de l'agitation du serveur. Cet article analysera les raisons et fournira des stratégies d'adaptation. Entrée de la version Web Deepseek: https://www.deepseek.com/deepseek serveur Raison: Accès simultané: des fonctionnalités gratuites et puissantes de Deepseek attirent un grand nombre d'utilisateurs à utiliser en même temps, ce qui entraîne une charge de serveur excessive. Cyber ​​Attack: Il est rapporté que Deepseek a un impact sur l'industrie financière américaine.

GATE.IO Version Web de connexion OFFICIEL GATE.IO Login URL 2025 GATE.IO Version Web de connexion OFFICIEL GATE.IO Login URL 2025 Feb 20, 2025 pm 02:09 PM

GATE.IO Exchange fournit aux utilisateurs un portail de connexion officiel. Via le site Web officiel ou l'application mobile, les utilisateurs peuvent se connecter à leur compte. Les étapes de connexion sont faciles, notamment la saisie de l'e-mail ou du numéro de téléphone mobile utilisé lors de l'enregistrement, ainsi que votre mot de passe. Afin d'assurer la sécurité du compte, il est recommandé aux utilisateurs de modifier régulièrement leurs mots de passe et de conserver correctement leurs informations de connexion. De plus, l'article fournit également des solutions aux problèmes de connexion courants, y compris l'incapacité de se connecter et la perte de mot de passe.

Comment ajuster l'échange ouvert en sésame en chinois Comment ajuster l'échange ouvert en sésame en chinois Mar 04, 2025 pm 11:51 PM

Comment ajuster l'échange ouvert en sésame en chinois? Ce didacticiel couvre des étapes détaillées sur les ordinateurs et les téléphones mobiles Android, de la préparation préliminaire aux processus opérationnels, puis à la résolution de problèmes communs, vous aidant à changer facilement l'interface d'échange Open Sesame aux chinois et à démarrer rapidement avec la plate-forme de trading.

Application Sesame Open Door Exchange Téléchargement officiel Sesame Open Door Exchange Téléchargement officiel Application Sesame Open Door Exchange Téléchargement officiel Sesame Open Door Exchange Téléchargement officiel Mar 04, 2025 pm 11:54 PM

Les étapes de téléchargement officielles de l'application Sesame Open Exchange couvrent le processus de téléchargement du système Android et iOS, ainsi que des solutions de problèmes courantes, vous aidant à télécharger en toute sécurité et rapidement et à permettre des transactions pratiques de crypto-monnaies.

Sesame Open Door Exchange Page Web Login Dernière version GATEIO Entrée du site officiel Sesame Open Door Exchange Page Web Login Dernière version GATEIO Entrée du site officiel Mar 04, 2025 pm 11:48 PM

Une introduction détaillée à l'opération de connexion de la version Web Sesame Open Exchange, y compris les étapes de connexion et le processus de récupération de mot de passe.

Comment la technologie de rupture résout-elle le problème de l'expansion d'Ethereum? Comment la technologie de rupture résout-elle le problème de l'expansion d'Ethereum? Feb 27, 2025 pm 05:00 PM

Solutions: 1. Transactions de processus en parallèle; 2. Réduisez la charge sur les nœuds;

Que dois-je faire si je ne peux pas payer si j'achète des pièces? Pourquoi l'achat de pièces est-il gelé? Que dois-je faire si je ne peux pas payer si j'achète des pièces? Pourquoi l'achat de pièces est-il gelé? Mar 05, 2025 pm 06:45 PM

Lors de la négociation sur une plate-forme de trading de devises numériques, la situation la plus inquiétante est que le vendeur ne publie pas les pièces après les avoir achetés ou que l'acheteur ne peut pas payer. Ces deux situations affecteront sérieusement les transactions ultérieures. Cet article se concentrera sur la façon dont les acheteurs ne peuvent pas payer. Que dois-je faire si je ne peux pas payer si j'achète des pièces? Lorsque vous rencontrez des situations où le paiement n'est pas possible, vous devez d'abord vérifier votre propre mode de paiement et votre propre état, puis confirmer si le réseau et la plate-forme de trading fonctionnent normalement. Si le problème reste le même, le service client de la plate-forme est généralement la solution la plus efficace. Voici quelques solutions plus détaillées: Problèmes de méthode de paiement: Certaines banques ou institutions de cartes de crédit peuvent restreindre les transactions liées à la crypto-monnaie, en particulier les paiements internationaux. Il est recommandé d'essayer de contacter la banque ou la société de cartes de crédit pour les restrictions et de demander une levée temporaire; ou utiliser un autre mode de paiement.

See all articles