C# 15.1 Threads intro
C# 15.1 Threads intro
1 C# Thread
GENERALITA'
Così come il meccanismo del multitasking permette di avere più processi (task) in
esecuzione contemporanea (pseudo-parallelismo), così il meccanismo del multithreading
permette di avere singoli processi che contengono più attività indipendenti (thread) in
esecuzione contemporanea.
Quando un programma è scritto per avere due o più parti di codice indipendente, si
parla di programma mulithreaded. Ciascuna parte indipendente è detta thread.Un
thread è quindi una unità di codice eseguibile in modo indipendente.
Le CPU multicore non possono esprimere tutta la loro potenza in assenza di programmi
multithreaded!!
• Il thread è l'unità alla quale è assegnata la CPU (il round-robin è fatto sui thread
e non sui processi).
• l'accesso ad una serie di thread gestiti dal CLR (dal sistema di runtime)
La classe Thread è usata per costruire l'oggetto che racchiude in sé la parte di codice
indipendente. Una volta costruito l'oggetto Thread, è poi possibile usare i metodi per
far partire il thread, sospenderne l'esecuzione, fermarlo, distruggerlo...
OPERATIVAMENTE...
}
3. Far partire il thread creato: th.Start()
.........
}
}
• Il main thread termina appena dopo aver generato e mandato in esecuzione il thread th.
Ecco una variante curiosa. Il main thread fa anche lui qualcosa. Eseguendo questo
programma, si vede in modo evidente il comportamento preemptive del sistema
operativo.
using System;
using System.Threading;
namespace ThreadZero
{
class Codice
{
public void Attività()
{
for (int i=0 ; i<300 ; i++) //ciclo finito
Console.Write("y");
}
}
}
namespace ThreadZero
{
class Program
{
static void Main(string[] args)
{
Codice codice = new Codice();
Thread t = new Thread(new ThreadStart(codice.Attività));
t.Start(); // running Attività()
Perchè possibile? Perchè non c'è garanzia di quando un thread viene selezionato dallo
scheduler. Eseguire più volte il programma per verificare l'asserzione appena fatta.
E' possibile far terminare il main thread solo dopo che il thread secondario è
terminato. Per ottenere questo comportamento si usa il metodo Join(), che è un
metodo che blocca il thread chiamante finchè un thread chiamato non è terminato.
Thread.Sleep(10); //system call: il main thread si sospende per (10 millisec), per
permettere a th di far qualcosa