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

Vista: 49134|Risposta: 4

[Fonte] .NET/C# Lock Principle Monitor fornisce una spiegazione approfondita

[Copiato link]
Pubblicato su 29/04/2021 09:54:10 | | | |
L'istruzione lock prende il mutex di un dato oggetto, esegue un blocco di istruzione e poi rilascia il lock. Quando si tiene una serratura, il filo che la tiene può acquisire e liberare nuovamente la serratura. Qualsiasi altro filo è bloccato dal poter ottenere la serratura e aspetta che venga liberato.

Recensione:

.net/c# Lock(string){...} Concurrency multithreaded utente Spiegazione dettagliata
https://www.itsvse.com/thread-7764-1-1.html

Usa il codice della serratura

Equivalente a

Si può pensare che il codice sottostante di Lock sia implementato da Monitor.

Dato che il codice usa try... finalblock, quindi anche se viene inserita un'eccezione nel corpo dell'istruzione lock, il lock viene rilasciato.

Non puoi usare il blocco operatore await nel corpo della dichiarazione.Non puoi usarlo nel corpo della dichiarazioneaspettaBlocco operatore。 Non puoi usare il blocco operatore await nel corpo della dichiarazione. Non puoi usare il blocco operatore await nel corpo della dichiarazione. Questa frase è molto importante!

Documentazione:Il login del link ipertestuale è visibile.

Io stesso testo il codice,Usa Task per ottenere la serratura e usa await per bloccare, il codice è il seguente:

Dopo aver eseguito il codice successivo più volte, il risultato dell'esecuzione non è quello previsto.



Perché? Se provi a usare la parola chiave await quando provi a usare la parola chiave await nel blocco lock, otterrai questo errore di compilation: await no può aspettare nel corpo di una istruzione lock. Il motivo è che, dopo aver completato await, il metodo può essere eseguito in un thread diverso invece che nel thread (thread che chiama) prima della parola chiave await.Parola chiave lock.stesso filoSblocca e sblocca la serratura nella serratura
Modifica il codice per vedere il motivo in modo più intuitivo:

Ottieni l'ID del filettamento del blocco e l'id del filettamento del rilascio del blocco,Ovviamente non in un thread, quindi il lucchetto non può essere sbloccato con successo, come mostrato nella figura sottostante:



Ho provato a modificare il codice, testato con il thread, eseguito più volte, e ha funzionato come previsto, il codice è il seguente:



(Fine)





Precedente:(to).NET/C# per impacchettare la cartella in un file zip
Prossimo:Redis utilizza script Lua per spiegazioni dettagliate
 Padrone di casa| Pubblicato su 10/02/2022 09:20:09 |

Non sbloccare la serratura





 Padrone di casa| Pubblicato su 25/06/2023 19:57:43 |
Il metodo di sincronizzazione degli oggetti veniva chiamato da un blocco di codice non sincronizzato.
Il seguente codice fornirà un errore come sopra




 Padrone di casa| Pubblicato su 12/08/2023 19:47:49 |
Zucchero con sintassi blocca, come mostrato di seguito:






 Padrone di casa| Pubblicato su 11/07/2024 10:44:02 |
【Turn】C# concorrenza multithread sotto vari blocchi
https://www.itsvse.com/thread-10561-1-1.html
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