Esempio # 01: senza costrutto di blocco
Iniziamo con il primo esempio di questo articolo per l'utilizzo di blocco in C#. Quindi, dobbiamo prima creare una struttura del codice C#. Senza la struttura del codice standard C#, il nostro codice non funzionerà. Pertanto, è necessario avviarlo con l'uso della libreria "Sistema" specificata dalla parola chiave "utilizzando" nel codice. Dato che dobbiamo lavorare sui thread, dobbiamo specificare lo spazio dei nomi threading della libreria di sistema tramite la parola chiave "usando".
Entrambe le biblioteche sono necessarie per l'implementazione di blocchi e thread nei nostri esempi in questo articolo. Dopo questo, abbiamo inizializzato una semplice classe "test" nel codice C#. Puoi anche definire uno spazio dei nomi prima della classe ma non è necessario qui. La classe "test" contiene un totale di 2 funzioni. Uno è una funzione definita dall'utente denominata "show ()" e l'altra è la funzione principale () di c# che è anche una funzione esecutore nei codici C#. Il processo di esecuzione inizia dal metodo principale () di questo programma. Abbiamo usato la classe "thread" dello spazio dei nomi "threading" per la creazione di due nuovi oggetti thread T1 e T1 con l'aiuto di una "nuova" parola chiave.
All'interno della creazione del thread, abbiamo usato la funzione "Show" negli argomenti di "thread" per renderlo una funzione thread. Poiché abbiamo creato 2 thread, significa che la funzione show () verrà utilizzata 2 volte nel codice come thread 1 e thread 2 rispettivamente. Questa è solo una creazione di thread e non la sua esecuzione. Per eseguire il thread, dobbiamo utilizzare la funzione "Start" dallo spazio dei nomi delle classi di threading. Quindi, l'oggetto "T1" del thread 1 è stato usato per chiamare la funzione "start" per eseguire la funzione thread "show". Dopo il primo thread, il secondo thread T2 eseguirà il metodo "Mostra" usando la stessa funzione di avvio. Ora, quando è stato avviato un thread, la funzione show () verrà eseguita usando il suo ciclo "per" per un massimo di 5 iterazioni. Fino all'esecuzione del ciclo, continuerà a eseguire la sua "console.WriteLine () "Funzione Dichiarazione per visualizzare il numero di iterazione utilizzando la variabile iterazione" I ". Dopo ogni iterazione, il thread avrà un sonno di 3 secondi usando la funzione "Sleep" di C# qui. Lo stesso verrà ripetuto quando inizierà un secondo thread. Ora, poiché abbiamo usato i thread per eseguire la funzione "Mostra", non è sicuro che la eseguirà in un modo in cui . Discussione 1 prima e poi thread 2. Salviamo il nostro codice per vedere il suo risultato.
Abbiamo bisogno di comandi C# Compiler e Runtime Environment per compilare ed eseguire i nostri codici. Abbiamo già installato entrambi. Pertanto, abbiamo usato il comando C# "MCS" usato come compilatore C# per compilare questo codice appena fatto. La compilation non restituisce altro che genera un nuovo file "exe" nella stessa cartella corrente i.e. riuscito.
Quindi, abbiamo eseguito questo file "exe" per il codice C# con il comando "Mono" di C#. Poiché entrambi i thread sono stati avviati nella funzione principale (), quindi continuano a eseguire la funzione show () uno dopo l'altro su ogni iterazione. Ciò significa che quel thread stava prendendo le risorse dall'altro thread mentre il primo non ha nemmeno completato completamente l'esecuzione. Questo può anche causare deadlock.
Esempio # 02: con costrutto di blocco
Per impedire all'esecuzione dei thread contemporaneamente mentre le risorse vengono condivise o richieste, dobbiamo utilizzare il costrutto "blocco" nel codice C#. Il costrutto di blocco assicurerà, non consentirà a nessun altro thread di ottenere risorse attualmente utilizzate dal processo attualmente in esecuzione fino a quando non completa la sua esecuzione. Questo può funzionare sulla regola prioritaria o . primo arrivato, primo servito. Per utilizzare il costrutto "blocco", dobbiamo creare un oggetto per il blocco usando la classe "oggetto" di C#.
Questo oggetto deve essere di tipo statico di sola lettura. Puoi nominarlo tutto ciò che desideri. La creazione di un oggetto Lock assicura che venga creato un blocco e non applicato su alcune parti del codice. L'abbiamo chiamato "Stop". Ora, dobbiamo creare un costrutto con la sua parola chiave "blocco" e specificare il nome del blocco nei suoi argomenti come "arresto" all'interno della funzione "show". Poiché la funzione show () è il nostro thread, dobbiamo inserire la sua implementazione all'interno del costrutto "blocco" (i.e. il pezzo di codice a cui vogliamo limitare l'accesso.) Ora, il nostro codice è pronto poiché il blocco è stato applicato al pezzo di codice all'interno della funzione thread. Salva questo codice aggiornato ed eseguilo per vederne il risultato.
Abbiamo compilato questo codice aggiornato sul nostro terminale Ubuntu ed eseguito il suo file "exe" dopo. Questa volta, l'intera funzione di "spettacolo" è stata eseguita completamente (i.e. Il loop "per" è completato.) Questo perché entrambe le volte in cui un thread viene avviato con la funzione "start", il costrutto di blocco "stop" ha bloccato il codice funzione show () fino a quando il primo thread non ha completato la sua esecuzione. Dopodiché, questo è successo anche a Thread 2. Pertanto, la nostra produzione è liscia.
L'output sopra visualizzato verrà visualizzato senza alcuna pausa e in un secondo sullo schermo. Questo non ti permetterà di vedere come le iterazioni funzionano una dopo l'altra quando non vi è alcun ritardo nell'esecuzione durante l'utilizzo di un blocco. Aggiorniamo la funzione "Show" nello stesso codice e aggiungiamo la funzione di sonno in essa prendendo 2 secondi di sonno dopo l'esecuzione della console.Dichiarazione di funzione WriteLine () durante l'iterazione. Salva questo codice con Ctrl+S, chiudi il file e apri la shell.
Dopo aver compilato il file di codice, abbiamo eseguito il suo file "exe" sulla shell. Il codice inizia a eseguire i suoi thread. Il primo thread "Show" è iniziato mentre dormiva per 2 secondi dopo ogni iterazione come mostrato di seguito.
Dopo che il primo thread "show" completa la sua esecuzione, il blocco ha rilasciato l'accesso alla funzione show e il thread 2 è stato acquisito per l'esecuzione.
Conclusione:
Questo articolo contiene dettagli sul costrutto di blocco in C#. Abbiamo discusso del nostro primo esempio senza usare il costrutto "blocco" e ottenuto un output con l'esecuzione casuale e non ordinata di una funzione thread. Abbiamo discusso anche le cause di questa esecuzione non ordinata del thread. Successivamente, abbiamo discusso di un esempio con l'uso del costrutto "blocco" e ottenuto un output con un modo casuale di esecuzione del thread.