PDA

View Full Version : [C#] Threading (funzioni obsolete)


mcaisco
07-02-2009, 11:50
Sto facendo alcune prove con il threading in .Net in C#. Non capisco perchè le funzioni suspend() e resume() sono marcata "deprecated". Come linea guida msdn (e anche il debugger di Visual Studio) indica di "utilizzare altre strutture per la sincronizzazione dei thread, come Monitor, Semafori e Mutex".
Ma che c'entrano monitor & co. con il fatto di sospendere e riavviare un thread? Perchè dovrei scomodare queste strutture tipicamente per la concorrenza?

Tra l'altro parallelamente notavo che come struttura principe per il threading viene consigliato il BackgroundWorker che però fornisce solo i metodi per avviare e abortire un thread. Niente suspend e resume.

Sono perplesso.

U-Boat
07-02-2009, 15:21
Il motivo è che sono due funzioni molto "brutali" e per questo non danno alcuna garanzia sullo stato in si troverà il thread - o il programma in generale - dopo la sospensione.
Il rischio principale è quello di deadlock che potrebbe verificarsi nel caso in cui un thread venga sospeso mentre si trova all'interno di un blocco protetto da un lock, visto che impediresti ad altri thread di procedere; fai attenzione che il lock potresti acquisirlo anche invocando un metodo di un altro oggetto, quindi non puoi fare considerazioni semplicemente guardando il solo codice del thread.
Se ti serve fermare un thread devi gestirlo tu manualmente.

mcaisco
07-02-2009, 16:36
In effetti sì. la Suspend() è rischiosa.
Però lo stesso dovrebbe valere per la Abort() no? O la Interrupt().
Insomma, rischio anche qui di chiudere un thread lasciando bloccata qualche risorsa.

U-Boat
07-02-2009, 17:28
Non conosco .net così in dettaglio da dirti se quei metodi sono "pericolosi", io lavoro su java, comunque ti consiglio di dare una lettura a questo http://java.sun.com/j2se/1.4.2/docs/guide/misc/threadPrimitiveDeprecation.html dove ti spiega come fermare e sospendere un thead in modo sicuro nel caso ti serva.