Italian community of Lazarus and Free Pascal
Programmazione => Generale => Topic aperto da: xinyiman - Ottobre 10, 2012, 10:04:28 pm
-
Ciao ragazzi, prima che ci perda del tempo qualcuno sa dirmi se le variabili globali funzionano in multithreading? Ovvero se io uso una variabile globale che quando schiaccio su un pulsante mi setta a false e così mi fa uscire da un ciclo while all'interno di un thread non principale?! Lo so mi sono spiegato come un cane...
-
Io ne ho usata una, ma l'ho dichiarata nel form.
Però, adesso che mi ci fai pensare, dovrebbe funzionatre anche una variabile globale.
Non so se è eccessivo, ma io ho creato 2 procedure: una che legge tale variabile ed una che la scrive. Entrambe le operazioni sono "soggette" alla CriticalSection.
Ciao, Mario
-
Mario, quando accedi a variabili con i thread è sempre buona norma mettere un semaforo.
La critical section funge da semaforo "improprio" in questo caso. ;)
xinyiman Prova ad usare un Mutex per accedere alla variabile.In questo caso hai la garanzia che solo un thread alla volta potranno accedere a quella variabile.
-
Grazie del consiglio.
C'è però un problema: da quello che avevo letto, io credevo che fossero la stessa cosa ...
Saresti così paziente da spiegarmi che difefrenza c'è, in modo da poterci ragionare su la prossima volta?
Grazie, Mario
-
Ciao ragazzi, prima che ci perda del tempo qualcuno sa dirmi se le variabili globali funzionano in multithreading? Ovvero se io uso una variabile globale che quando schiaccio su un pulsante mi setta a false e così mi fa uscire da un ciclo while all'interno di un thread non principale?! Lo so mi sono spiegato come un cane...
penso che l'approccio giusto sia di dichiarare una proprietà o un metodo nel thread.
quando nella GUI qualcuno schiaccia il pulsante "interrompi" il processo principale dovrebbe passarsi tutti i thread ancora in esecuzione ed impostare questa proprietà col valore che ne interrompe l'esecuzione.
un oggetto non dovrebbe dipendere da altri oggetti per quanto riguarda il suo funzionamento altrimenti viene meno la possibilità di poterlo riutilizzare.
-
Nomore,
per questo (in un'altra discussione) parlavo di gestore dei thread.
Ma è vero anche che, se devo accedere in concorrenza a una zona di memoria (che sia una porta o una risorsa condivisibile a scelta) devo applicare delle metodologie per rendermi la vita più semplice. O no;)
Mario,
http://it.wikipedia.org/wiki/Mutex
http://it.wikipedia.org/wiki/Sezione_critica
Diciamo che la sezione critica è un concetto "astratto" (al di la che Windows fornice alcune api) il Mutex è un semaforo a slot singolo, per cui funge da controllore per sezione critica. Solo che lo getisci direttamente tu. Non deleghi al sistema operativo (e in ambito multi-platform possono cambiare i comportamenti da uno all'altro sistema operativo ;) ).
-
Nomore,
per questo (in un'altra discussione) parlavo di gestore dei thread.
Ma è vero anche che, se devo accedere in concorrenza a una zona di memoria (che sia una porta o una risorsa condivisibile a scelta) devo applicare delle metodologie per rendermi la vita più semplice. O no;)
poco ma sicuro, infatti in questo caso non è che ci siano alternative all'adottare un sistema che garantisca l'accesso concorrente :)
però sono sempre dell'opinione che un thread, per quanto riguarda la sua terminazione, non debba dipendere da una risorsa esterna. per spiegarmi meglio: se abbiamo N thread della stessa classe e tutti con accesso alla stessa variabile globale, devono terminare tutti?
-
hahahaha
Mi vengono in mente una miriade di battutaccie ;)
Diciamo che se la logica del programma lo prevede sì.