Questo articolo è un articolo speculare di traduzione automatica, clicca qui per saltare all'articolo originale.

Vista: 4864|Risposta: 4

[Fonte] 【Turn】C# concorrenza multithread sotto vari blocchi

[Copiato link]
Pubblicato il 13-04-2023 18:44:49 | | | |
In circostanze normali, finché è coinvolta la programmazione multithread, la complessità del programma aumenterà significativamente, le prestazioni diminuiranno notevolmente e la probabilità di bug aumenterà notevolmente.

La programmazione multithread è pensata per eseguire un programma in parallelo per migliorare le capacità di elaborazione dei dati, ma nella maggior parte dei casi comporta una competizione per le risorse condivise, quindi deve essere bloccata quando si modificano gli oggetti risorsa. Tuttavia, ci sono molti modi per implementare i lock, quindi diamo un'occhiata all'implementazione e alle prestazioni di diversi tipi di lock in C#.

Diversi modi per usare le serrature

1. Blocco atomico

Raggiungere la competizione "senza lockless" tramite l'operazione atomica Interlocked.CompareExchange.

La spiegazione ufficiale è fornire operazioni atomiche per variabili condivise da più thread. Namespace: System.Threading

2. Area critica

La serializzazione di più thread per accedere a risorse pubbliche o a un pezzo di codice è veloce e adatta per controllare l'accesso ai dati. La sintassi del lock in C# è uno zucchero sintattico per l'area critica (Monitor).

3. Funzionamento atomico

Le operazioni atomiche, che sono un caso particolare, sono intrinsecamente sicure per thread, quindi non c'è bisogno di bloccarle.

Interpretato ufficialmente come l'incremento del valore di una data variabile sotto forma di un'operazione atomica e la memorizzazione del risultato. Namespace: System.Threading

4. Blocco per lettura e scrittura

I blocchi di lettura-scrittura permettono di leggere risorse mentre altri programmi stanno scrivendo, quindi se la risorsa permette letture sporche, questo è più appropriato.

La spiegazione ufficiale indica uno stato bloccato utilizzato per gestire l'accesso alle risorse, consentendo letture multithread o accesso esclusivo alla scrittura. Il namespace è System.Threading

5. Semaforo

Semafori, progettati per controllare un numero limitato di risorse utente.

La spiegazione ufficiale limita il numero di thread che possono accedere a una risorsa o a un pool di risorse contemporaneamente. Il namespace è System.Threading

6. Eventi

Usato per notificare al thread che alcuni eventi sono avvenuti, iniziando l'inizio di un compito successore.

La spiegazione ufficiale afferma che gli eventi di sincronizzazione dei thread si resettano automaticamente quando un segnale viene ricevuto dopo il rilascio di un thread. Tali tipi non possono essere ereditati.

7. Esclusione reciproca

Esiste una classe Mutex in C#, appena sotto il System.Threading namespace, Mutex è in realtà un mutex, che non solo può gestire la competizione tra più thread, ma anche gestire la competizione tra processi.


Codice per il test delle prestazioni

Esegui il codice

Risultati dei test di prestazione



Nota: I dati sopra riportati sono solo il risultato delle prestazioni hardware dell'attuale ambiente di test e possono essere confrontati solo tra loro.

1) In vari test, è sicuramente il più veloce a non bloccarsi, quindi cerca di evitare la competizione delle risorse che porta a un funzionamento bloccato.

2) Interconnesso.CompareExchange mostra costantemente prestazioni superiori nel multithreading, posizionandosi al secondo posto.

3) La terza serratura, la zona critica, mostra anch'essa buone prestazioni, quindi per favore confutate gli altri quando dicono che la prestazione della serratura è bassa.

4) Il quarto posto è l'operazione a variabile atomica (atomica), ma attualmente supporta solo l'auto-aumento e la sottrazione delle variabili, e l'applicabilità non è forte.

5) Le prestazioni del quinto blocco di lettura/scrittura (ReaderWriterLockSlim) sono anch'esse accettabili, non supportano la lettura e la praticità è ancora relativamente buona.

6) I restanti semafori, eventi e mutex hanno le peggiori prestazioni, ovviamente hanno il proprio ambito di applicazione, ma non si comportano bene nel gestire la competizione delle risorse.

Indirizzo del link originale:Il login del link ipertestuale è visibile.





Precedente:ASP.NET Core (16) Dipendente dall'iniezione di servizi di registrazione dinamica
Prossimo:La soft route OpenWrt viene avviata tramite una chiavetta USB
 Padrone di casa| Pubblicato il 13-04-2023 18:46:52 |
I programmi C# permettono a una sola istanza di eseguire il codice corretto
https://www.itsvse.com/thread-3391-1-1.html

La differenza tra ManualResetEvent e AutoResetEvent appreso dai thread C#
https://www.itsvse.com/thread-4810-1-1.html

[Combattimento vero e proprio]. NET/C# utilizza SemaphoreSlim per limitare i metodi di esecuzione concorrente
https://www.itsvse.com/thread-10259-1-1.html

C# Lettura/Scrittura Blocco LettoreScrittoreBloccaUso limitato
https://www.itsvse.com/thread-3545-1-1.html

.net/c# Lock(string){...} Concurrency multithreaded utente Spiegazione dettagliata
https://www.itsvse.com/thread-7764-1-1.html
Pubblicato il 13-04-2023 19:21:44 |
Impara un po'...
Pubblicato il 16-05-2023 20:03:52 |
Impara un po'...
Pubblicato il 19-05-2023 11:41:25 |
Impara a imparare
Disconoscimento:
Tutto il software, i materiali di programmazione o gli articoli pubblicati dalla Code Farmer Network sono destinati esclusivamente all'apprendimento e alla ricerca; I contenuti sopra elencati non devono essere utilizzati per scopi commerciali o illegali, altrimenti gli utenti dovranno sostenere tutte le conseguenze. Le informazioni su questo sito provengono da Internet, e le controversie sul copyright non hanno nulla a che fare con questo sito. Devi eliminare completamente i contenuti sopra elencati dal tuo computer entro 24 ore dal download. Se ti piace il programma, ti preghiamo di supportare software autentico, acquistare la registrazione e ottenere servizi autentici migliori. In caso di violazione, vi preghiamo di contattarci via email.

Mail To:help@itsvse.com