Autore Topic: Service Multithread e struttura condivisa  (Letto 1274 volte)

Offline Willow1987

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus Transformer tf101
  • Sistema operativo:
    Ubuntu 10.04
Service Multithread e struttura condivisa
« il: 27 Febbraio 2013, 14:24:13 CET »
0
Salve questa domanda è sia teorica che pratica:

Supponiamo di avere un Service che lancia due thread. Questi thread ricevono o inviano dati da/su una socket.
I dati reperiti dai thread vengono gestiti all'interno del service. Quindi si avranno 2 handler.
Il primo gestore scrive dei dati su un array e il secondo gestore li legge soltanto.

domanda1) I thread vengono eseguiti insieme, ma i gestori? E' necessario mettere la struttura condivisa in mutua esclusione, se comunque non
sono direttamente i thread a modificarla ma sono i loro gestori? Diciamo che il mio dubbio è sull'esecuzione dei gestori, chi va prima e chi va dopo? Se io sto gestendo un caso del thread 1 e nel frattempo anche il thread 2 deve gestire un altra cosa, che succede?

domanda2) Se mettiamo caso il mio array di interi condiviso deve essere protetto devo farlo sincronized oppure devo aggiungere i mutex, qual'è la differenza?

grazie in anticipo  :-P

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Service Multithread e struttura condivisa
« Risposta #1 il: 27 Febbraio 2013, 19:36:29 CET »
0
Le domande sono molto specifiche e non banali (almeno per me), però ti dico cosa ne penso.

Se trasmetti i dati da/a thread all'interno di messaggi (ipotizzo sia questo il caso perchè parli di Handler), allora non serve nessuna gestione di accesso concorrente ai dati. I messaggi sono thread-safe per definizione.

Se invece hai una struttura dati condivisa ed in generale due thread vi possono accedere, devi gestire in qualche modo l'accesso concorrente, esempio rendendo la struttura dati synchronized (oppure i metodi per accedervi).

Se i dati che di volta in volta devi trattare sono relativamente pochi, i messaggi rendono tutto molto semplice senza penalizzare troppo le performance.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Willow1987

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus Transformer tf101
  • Sistema operativo:
    Ubuntu 10.04
Re:Service Multithread e struttura condivisa
« Risposta #2 il: 14 Marzo 2013, 09:31:31 CET »
0
Innanzitutto grazie per la risposta  :-)
Si in effetti hai capito bene io comunico con l 'handler tramite messaggio, però non mi preoccupavo di quella struttura bensì di quella dichiarata nel service.
Ti faccio un esempio:
Io ho un service con :
 ArrayList<String>  parole;

// qui lancio 1 thread che legge string dalla socket ---> gli passo l'handler1
//qui lancio 1 thread che scrive string sulla socket --->gli passo l'handler2

Handler han1 = new ...{

handlemsg(){

String parola = msg.obj;
parole.add(parola):

}

};

Handler han2 = new ...{

handlemsg(){

String tosend = parole.get(i);
//codice per mandare al thread2 la parola da scrivere sulla socket

}

};

Scusa se ho scritto male ma è per fare capire che la struttura parole non è condivisa tra i thread ma vi accedono i due handler, forse anche in contemporanea. In questo caso non mi è chiaro come comportarmi
grazie mille



Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Service Multithread e struttura condivisa
« Risposta #3 il: 14 Marzo 2013, 11:18:35 CET »
0
Più facile a dirsi che a farsi :P

Codice (Java): [Seleziona]
List<String> parole = Collections.synchronizedCollection(new ArrayList<String>());
In questo modo crei una list cosiddetta "thread-safe"
« Ultima modifica: 14 Marzo 2013, 11:20:45 CET da Ricky` »

Offline Willow1987

  • Nuovo arrivato
  • *
  • Post: 5
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Asus Transformer tf101
  • Sistema operativo:
    Ubuntu 10.04
Re:Service Multithread e struttura condivisa
« Risposta #4 il: 14 Marzo 2013, 16:04:01 CET »
0
Ok questa risposta è per la mia seconda domanda, cioè come renderla thread-safe e va bene, sicuramente farò così  :-P ,
ma la mia domanda principale era se effettivamente ci fosse bisogno di renderla thread-safe visto che non sono i thread ad accedervi ma i loro handler.

Ci sono 2 possibilità:
1) Gli handler vanno in esecuzione contemporaneamente così come i loro thread e quindi la struttura deve essere protetta  (impilica)---> faccio come mi hai detto
2) Gli handler se ricevono contemporaneamente messaggi dai loro thread si accodano, cioè prima va in esecuzione un handler e tratta il messaggio del thread e lo scrive nell array, poi va in esecuzione l'altro e accede all'array anche lui. In questo caso è inutile metterlo thread safe perchè accedono uno alla volta.

Vorrei proprio capire come funziona... anche perchè non trovo spiegazioni sui libri

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Service Multithread e struttura condivisa
« Risposta #5 il: 14 Marzo 2013, 16:24:52 CET »
0
Fai un po' di debug, basta che metti un paio di break point e vedi gli handler in che thread sono in esecuzione ;)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Service Multithread e struttura condivisa
« Risposta #6 il: 14 Marzo 2013, 17:32:39 CET »
0
2) Gli handler se ricevono contemporaneamente messaggi dai loro thread si accodano, cioè prima va in esecuzione un handler e tratta il messaggio del thread e lo scrive nell array, poi va in esecuzione l'altro e accede all'array anche lui. In questo caso è inutile metterlo thread safe perchè accedono uno alla volta.

Vorrei proprio capire come funziona... anche perchè non trovo spiegazioni sui libri

A mio parere (molto personale e quindi suscettibile di errore), se i due handler sono in thread diversi, devi proteggere l'accesso concorrente ad una struttura dati. Non è possibile fare assunzioni sul fatto che la loro esecuzione venga serializzata, anche perchè ciò avviene quando sono sincronizzati.

Puoi rendere implicita tale sincronizzazione facendo in modo che un solo handler riceva il messaggio, acceda alla struttura, quindi spedisca un messaggio al secondo handler che a sua volta fa la sua parte di lavoro. Ovviamente dipende molto da quello che devono fare.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store