Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy?
Google Pixel 10 è uno smartphone che unisce una fotocamera molto più versatile rispetto al passato grazie allo zoom ottico 5x, il supporto magnetico Pixelsnap e il nuovo chip Tensor G5. Il dispositivo porta Android 16 e funzionalità AI avanzate come Camera Coach, mantenendo il design caratteristico della serie Pixel con miglioramenti nelle prestazioni e nell'autonomia. In Italia, però, mancano diverse feature peculiari basate sull'AI.
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre
L'abbonamento Ultimate di GeForce NOW ora comprende la nuova architettura Blackwell RTX con GPU RTX 5080 che garantisce prestazioni tre volte superiori alla precedente generazione. Non si tratta solo di velocità, ma di un'esperienza di gioco migliorata con nuove tecnologie di streaming e un catalogo giochi raddoppiato grazie alla funzione Install-to-Play
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco
Deebot X11 Omnicyclone implementa tutte le ultime tecnologie Ecovacs per l'aspirazione dei pavimenti di casa e il loro lavaggio, con una novità: nella base di ricarica non c'è più il sacchetto di raccolta dello sporco, sostituito da un aspirapolvere ciclonico che accumula tutto in un contenitore rigido
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 20-08-2009, 16:02   #1
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
[Java] Programmazione concorrente e thread

Ciao, sto esaurendo su un progetto per l'esame di programmazione concorrente spero di trovare qualcuno che mi possa chiarire qualche dubbio.

Per adesso solo una domandina rapida rapida:

E' possibile che un thread in un ciclo while(condizione) monopolizzi la CPU in modo da non permettere ad un altro thread di cambiare tale condizione facendo andare il programma in loop infinito?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 20-08-2009, 17:13   #2
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Dal punto di vista di Java sì, non c'è una politica di fairness prestabilita.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 20-08-2009, 17:53   #3
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Dal punto di vista di Java sì, non c'è una politica di fairness prestabilita.
Allora, la mia situazione è questa:

Devo implementare una receiveAny su un array di porte.

Ho un semaforo su cui il server si sospende se tutte le porte sono vuote (nessun mittente ha lasciato un messaggio).

Il server sospeso su questo semaforo viene svegliato dal mittente prima di aver depositato il messaggio. Purtroppo lo devo svegliare prima di aver effettivamente lasciato il messaggio perché le porte sono sincrone, cioè quando il mittente inserisce il messaggio si sospende in attesa che qualcuno faccia receive.

Per superare l'inconveniente che il server svegliato dal semaforo porteVuote non trovi alcun messaggio perché il mittente perde il controllo della CPU dopo aver segnalato il server ma prima di aver effettivamente inserito il messaggio ho fatto così:

Codice:
	private int testa_porte()throws InterruptedException{

		int porta = -1;

		for(int i=0; i<array.length; i++){
			if(array[i].haveSospesi()){
				porta = i;
				break;
			}
		}

		porteVuote.acquire();

		while(porta == -1){
			System.out.println("Cerco...");
			for(int i=0; i<array.length; i++){
				if(array[i].haveSospesi()){
					porta = i;
					break;
				}
			}

			Thread.sleep(500);

		}

		return porta;

	}
In pratica il server inizialmente cerca il messaggio con un for finito.

Se tutte le porte sono vuote si sospende su porteVuote.

Quando viene risvegliato entra in un ciclo while che gli fa testare le porte finché non trova effettivamente il messaggio, che in linea teorica prima o poi deve esserci perché qualche mittente ha fatto signal al server.

E' sbagliata come soluzione? Idee migliori?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 20-08-2009, 18:32   #4
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Se è sempre vera la condizione:

quando il server si sveglia esiste necessariamente almeno un messaggio in coda

allora funziona per forza.

Non è neanche detto che sia un brutta soluzione perchè per pause di durata certa e molto breve uno spinning è vantaggioso rispetto ad una struttura di controllo concorrente relativamente più complicata come può essere un swap.

Lo sleep io lo metterei prima, magari un po' più breve (un bel po' più breve, diciamo 1ms anche se la granularità dello sleep una volta era sui 10-15ms).

Alternative idealmente ce ne sarebbero. Il protocollo che hai non è strano.

Io entro, lascio un messaggio sulla coda in entrata della mail box 1 e resto in attesa sulla coda di uscita della stessa mail box.

Il server viene svegliato dal gestore delle MailBox, prende il messaggio della mail box 1, lo processa e inserisce la risposta nella coda di uscita della MailBox 1.

Io che ero in attesa sulla coda di uscita della MailBox1 me ne vado con la mia risposta.

Alla fine tutto dipende da dove puoi mettere le mani.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 20-08-2009, 19:04   #5
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Se è sempre vera la condizione:

quando il server si sveglia esiste necessariamente almeno un messaggio in coda

allora funziona per forza.
E' qui il punto. Non esiste necessariamente almeno un messaggio in coda ma esisterà. Il mittente sveglia il server prima di depositare effettivamente il messaggio questo perché appena deposita il messaggio si sospende su un semaforo.

Quindi è impossibile per me mittente segnalare il server dopo aver lasciato il messaggio.

In pratica lo segnalo un attimo prima... ma questa cosa ha il difetto che il mittente potrebbe segnalare e perdere il controllo della CPU prima di aver lasciato il messaggio... per questo il server svegliato va a cercare un messaggio che ancora non c'è.. ed è per questo che ho necessità del ciclo while dopo il risveglio...
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 20-08-2009, 19:19   #6
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Mi sono espresso male:

quando il server si sveglia esisterà necessariamente a breve un messaggio in coda
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-08-2009, 15:07   #7
Ikon O'Cluster
Registered User
 
Iscritto dal: May 2009
Messaggi: 300
Segnala entrambe le cose. Prima segnali che verrà messo un messaggio, quindi il server si sveglia, ma andrà in wait sulla coda di quella porta. Appena il client (dopo aver segnalato la sua intenzione di inserimento) effettua realmente l'inserimento allora il server si sveglia e riceve il messaggio. Ma non so se ho capito bene il problema...
Ikon O'Cluster è offline   Rispondi citando il messaggio o parte di esso
Old 23-08-2009, 15:18   #8
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Basterebbe il secondo segnale ma se il thread che deve segnalare si blocca subito dopo il deposito del messaggio chi lo manda?
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-08-2009, 17:57   #9
Ikon O'Cluster
Registered User
 
Iscritto dal: May 2009
Messaggi: 300
Scusate ora ho le idee un po' confuse perchè è passato troppo tempo dal corso di SISOP... Il codice non è formale.

Codice:
MsgQueue coda[N] = {EMPTY, ..., EMPTY};
Semaforo sem = 0;

void serverBody() {
	while(1) {   // Corpo del server eseguito ciclicamente...

		System.out.println("Controllo la presenza di messaggi.\n");
		sem.wait();
		System.out.println("Mi stanno inviando dei messaggi!\n");

		System.out.println("Vediamo chi è...\n");
		int c = 0;
		while(1) {
			if(!(coda[c].vuota())) {
				System.out.println("Messaggio da Client" + c +"!!!");
				Msg msg = coda[c].pop();
				Msg newMsg = elabora(msg.info());
				sendTo(c, newMsg);
				System.out.println("Servito!");
				break;
			}

			c=(c+1)%N;
		}

	}
}

Msg inviaMessaggio(int mittente, Msg msg) {

	System.out.println("Segnalo al server.\n");
	sem.signal();

	System.out.println("Accodo messaggio.\n");
	coda[mittente].push(msg);

	Msg msg = receiveFrom(SERVER);

	return msg;
}
In sostanza i client possono segnalare pure 1000 msg, il server ne elabora uno alla volta e quando il semaforo torna a 0 allora il server si blocca. Ogni volta che il server viene svegliato comincia a ciclare sulle code finchè il client non ha effettivamente accodato il messaggio. Appena lo trova elabora e risponde.

ATTENZIONE: Questa soluzione non gestisce i messaggi in ordine. Il client i che al tempo t1 invia un messaggio potrebbe essere gestito dal server dopo il client j che al tempo t2>t1 ha inviato il proprio messaggio.

Una soluzione un pò più "FAIR" è la seguente:

Codice:
MsgQueue coda[N] = {EMPTY, ..., EMPTY};
Semaforo sem = 0;
int c = 0;

void serverBody() {
	while(1) {   // Corpo del server eseguito ciclicamente...

		System.out.println("Controllo la presenza di messaggi.\n");
		sem.wait();
		System.out.println("Mi stanno inviando dei messaggi!\n");

		System.out.println("Vediamo chi è...\n");
		while(1) {
			if(!(coda[c].vuota())) {
				System.out.println("Messaggio da Client" + c +"!!!");
				Msg msg = coda[c].pop();
				Msg newMsg = elabora(msg.info());
				sendTo(c, newMsg);
				System.out.println("Servito!");
				break;
			}

			c=(c+1)%N;
		}

	}
}

Msg inviaMessaggio(int mittente, Msg msg) {

	System.out.println("Segnalo al server.\n");
	sem.signal();

	System.out.println("Accodo messaggio.\n");
	coda[mittente].push(msg);

	Msg msg = receiveFrom(SERVER);

	return msg;
}
In questa soluzione tutti i client hanno la medesima priorità, mentre nella precedente venivano avvantaggiati quelli ad indice più basso. Adesso non esiste più starvation....

Ultima modifica di Ikon O'Cluster : 23-08-2009 alle 18:08.
Ikon O'Cluster è offline   Rispondi citando il messaggio o parte di esso
Old 23-08-2009, 18:06   #10
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quello è uno spinning ed è la soluzione che già sta usando.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 23-08-2009, 18:10   #11
Ikon O'Cluster
Registered User
 
Iscritto dal: May 2009
Messaggi: 300
si ma mi convince più fatta come l'ho impostata io...
Ikon O'Cluster è offline   Rispondi citando il messaggio o parte di esso
Old 07-09-2009, 13:42   #12
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Stavo pensando... non sarebbe meglio se inserissi un time out nello spinning?
Se il mittente dopo aver fatto signal sul semaforo per qualsiasi ragione non consegnasse il messaggio? avrei un Server in loop?
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 07-09-2009, 14:03   #13
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Se non sei certo al mille per mille che il messaggio ci sarà lo spin non va più bene.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 07-09-2009, 15:15   #14
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Se non sei certo al mille per mille che il messaggio ci sarà lo spin non va più bene.
E come faccio ad essere certo? Io so che la signal è separata dall'inserimento del messaggio da poche istruzioni. Un mittente dopo la signal non può fare altro che rilasciare il messaggio.

Ma ipotizziamo il caso assurdo che il thread mittente venga killato dal SO dopo la signal (so che non è possibile ma facciamo finta che lo sia).. la soluzione è un time out?

Ci ho pensato per giorni e giorni e lo spinning sembra l'unica soluzione.
  • Non posso mettere le mani sul codice sottostante (Porta Sincrona).
  • Quando il mittente chiama Porta.send() si blocca dentro la Porta
  • Non posso segnalare il server dopo la send perché sono bloccato nella Porta

Unica soluzione lo spinning! ...o no?
__________________

Ultima modifica di luxorl : 07-09-2009 alle 15:43.
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 07-09-2009, 16:52   #15
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Come "come faccio ad essere certo"?

Devi guardare le istruzioni che stanno tra la notifica e il deposito, stabilire quali sono le condizioni che possono generare un mancato deposito e usarle per controllare lo spin.

Se la condizione è che il thread possa essere magicamente ucciso allora metterai come condizione del loop l'esistenza di almeno un thread client.

Il time-out pigliatutto è una soluzione un po' povera perchè una volta che scatta non sai perchè il messaggio sia andato perduto.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 07-09-2009, 17:03   #16
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Se la condizione è che il thread possa essere magicamente ucciso allora metterai come condizione del loop l'esistenza di almeno un thread client.
L'unica possibilità è questa. Perché tra la notifica e il deposito non c'è nulla che possa portare ad un mancato inserimento del messaggio.
Più che "almeno l'esistenza di un thread client", che potrebbe essere true anche se il mittente muore, potrei fare un while con condizione:

"finché il thread mittente è vivo && non trovo messaggio"

Questo si potrebbe fare solo se esiste un modo in Java per sapere se il thread con id x è ancora vivo. Esiste?
Se esiste potrei salvarmi l'id del thread mittente prima che questo notifichi il server e nello spinning verificare che il thread non sia misteriosamente scomparso.

Che ne pensi?
__________________

Ultima modifica di luxorl : 07-09-2009 alle 17:13.
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 07-09-2009, 17:20   #17
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
@luxorl: che tipo di scenario stai cercando di gestire? il tipico caso dell'utonto che inciampa sul cavo dell'alimentazione staccando la spina al pc?
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 07-09-2009, 18:54   #18
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Se l'unica possibilità è che il Thread muoia inspiegabilmente allora tranquillizzati perchè i Thread non muoiono mai di morte violenta - a differenza ad esempio dei processi.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 07-09-2009, 20:33   #19
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Se l'unica possibilità è che il Thread muoia inspiegabilmente allora tranquillizzati perchè i Thread non muoiono mai di morte violenta - a differenza ad esempio dei processi.
Ok
Grazie
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
Old 07-09-2009, 20:34   #20
luxorl
Senior Member
 
L'Avatar di luxorl
 
Iscritto dal: Oct 2003
Città: Pisa/Cosenza
Messaggi: 1364
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
@luxorl: che tipo di scenario stai cercando di gestire? il tipico caso dell'utonto che inciampa sul cavo dell'alimentazione staccando la spina al pc?
più o meno
__________________
luxorl è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Google Pixel 10 è compatto e ha uno zoom 5x a 899€: basta per essere un best-buy? Google Pixel 10 è compatto e ha uno zoom ...
Prova GeForce NOW upgrade Blackwell: il cloud gaming cambia per sempre Prova GeForce NOW upgrade Blackwell: il cloud ga...
Ecovacs Deebot X11 Omnicyclone: niente più sacchetto per lo sporco Ecovacs Deebot X11 Omnicyclone: niente più...
Narwal Flow: con il mocio orizzontale lava i pavimenti al meglio Narwal Flow: con il mocio orizzontale lava i pav...
Panasonic 55Z95BEG cala gli assi: pannello Tandem e audio senza compromessi Panasonic 55Z95BEG cala gli assi: pannello Tande...
Metroid Prime Beyond: arriva un trailer ...
Fujifilm GFX Eterna 55: una soluzione co...
Stardew Valley arriva su Switch 2: una c...
E-bike fat legale con "pulsante mag...
Nintendo Virtual Boy: l'accessorio per S...
Popucom si presenta come uno dei miglior...
Super Mario Galaxy il film: l'idraulico ...
Stellantis, contro risposta a BYD: "...
Microsoft evita una sanzione in Europa p...
TCL a IFA 2025: TV Mini LED, smartphone ...
Neanche la politica è salva: l'Al...
I nuovi Pixel 10 in mostra a Milano con ...
Perplexity di nuovo in tribunale: Merria...
AirPods 4 al minimo su Amazon: la versio...
Sam Altman sempre più convinto: l...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 21:36.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v