Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming
Pannello QD-OLED da 32 pollici con risoluzione 4K, frequenza di aggiornamento a 240Hz e tempi di risposta rapidissimi: il Gigabyte MO32U24 evolve il progetto del suo predecessore MO32U e alza ulteriormente l'asticella delle prestazioni. È ancora una volta un monitor indirizzato ai giocatori più esigenti
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh
realme 16 5G è un nuovo smartphone con sensore Sony IMX 852 da 50MP sul retro e uno specchio selfie fisico integrato nella camera bar, una prima nel segmento di mercato. Batteria da 6550mAh in un corpo da 8,1mm e 183g, certificazione IP69K e ricarica da 45W completano un pacchetto aggressivo per la fascia media, per uno dei prodotti più interessanti del produttore sul piano commerciale
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni
Sono ormai definitive le nuove norme del Codice della Strada per i monopattini elettrici. Non solo targa e assicurazione, le regole sono tante e riguardano diversi aspetti, vi spieghiamo come evitare sanzioni che possono essere salate
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 17-10-2006, 11:53   #1
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
[C++/Java] Come si fa il testing con thread concorrenti ?

Usando JUnit e CPPUnit in una applicazione multithread, come si fa a testare e verificare la correttezza della gestione della concorrenza ?

Cioè mettiamo che ci siano due thread, A e B, che devono accedere ad una classe condivisa, come si fa a scrivere un test che verifica che se A è in sezione critica B non entra in sezione critica se prima A non ne è uscito ?
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2006, 12:17   #2
lovaz
Senior Member
 
L'Avatar di lovaz
 
Iscritto dal: Jul 2002
Messaggi: 4334
In caso di java e' il linguaggio stesso che se ne preoccupa,
quando un blocco e' synchronized il programmatore sa
che solo un thread alla volta ci entrera'.

Per il C++ non so se il supporto e' a livello cosi' "basso".

Se invece intendi dimostrare che un programma non avra' mai
problemi di deadlock e affini mi sembra che il problema
non abbia soluzione per un prog. generico, ma solo
per casi (molto) banali.
lovaz è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2006, 12:54   #3
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
In effetti non avevo pensato ai metodi synchronized...
In C++ non ci sono costrutti a livello di linguaggio che permettono di esprimere la mutua esclusione, ma questa deve essere implementata con le syscall del sistema o con alcune librerie non standard...

Quindi limitandoci al C++ e al caso riportato sopra di due o più thread in mutua esclusione come si fa ?
Che poi sarebbe anche il caso in cui un metodo non sia synchronized, ma la sincornizzazione avviene su un determinato oggetto all'interno del metodo...

Non voglio dimostrare l'assenza di deadlock, ma volevo esprimere tramite test la necessità di una mutua esclusione...

Schematicamente:

MioThread A, B;
ClasseCondivisa cl;
A.avvia(cl);
B.avvia(cl);
//mettiamo che A e B girino accedendo a cl diverse volte
while(A.isRunning() || B.isRunning());

assert(cl è stata acceduta in mutua esclusione);

Quali costrutti si potrebbero usare per un simile test ?
L'unica cosa che mi viene in mente è registrare gli accessi alla classe....
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2006, 13:23   #4
lovaz
Senior Member
 
L'Avatar di lovaz
 
Iscritto dal: Jul 2002
Messaggi: 4334
La prima cosa che mi viene in mente:

all'inizio della sezione critica ci metti:

control = <qui metti qualcosa che indica univocamente il thread,
tipo il nome della classe, ecc.>

alla fine fai un assert che controlla che control sia ancora nel suo stato,
altrimenti vuol dire che e' stata "sporcata" da un altro thread.

Potrebbe essere del tutto scorretto, magari aspetta qualche "guru" della
concorrenza, tipo PGI-Bis
lovaz è offline   Rispondi citando il messaggio o parte di esso
Old 17-10-2006, 23:32   #5
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Ma che guru, manco ghiro!

Son talmente guru che, incuriosito dalla faccenda ho provato, in Java, a monitorare l'accesso di un Thread ad un metodo registrando codice hash e tempo di accesso e controllando, ogni volta che un Thread accede al metodo, se questo accesso sia sovrapposto a quello di un altro Thread (entrato e non ancora uscito o entrato e uscito in un periodo intersecante il tempo di accesso del nuovo Thread).

Risultato del test da guinnes dei primati: due thread non sono mai in conflitto o lo sono sempre! A prescindere dalla sincronizzazione!

E i mutex e i lock e i semaphores...TUTTE PALLE! C'ho qui il test c'ho! Carta canta signori! Ho quadrato il cerchio della concorrenza ho quadrato!

Avete problemi di concorrenza? ANTICHI!!! Buttate nel codice il test di PGI-GURU DELLA CONCORRENZA e per magia i vostri Thread o non saranno mai in conflitto o lo saranno sempre!

Ci faccio i miglioni ci faccio!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2006, 00:21   #6
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971


Posta un po' per curiosità
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2006, 09:00   #7
lovaz
Senior Member
 
L'Avatar di lovaz
 
Iscritto dal: Jul 2002
Messaggi: 4334
Ma va guru dei miei stivali... Sei 'na sola...
lovaz è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2006, 09:25   #8
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Mockare la classe condivisa? o i thread che ci accedono?
l'obbiettivo sarebbe quello di creare con un test una situazione sporca data dalla cattiva concorrenza, ma in pratica non saprei bene come fare...
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2006, 10:02   #9
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Avevo pensato anche io a mockare la classe condivisa, ma è un lavoro dispendioso...soprattutto se le classi condivise sono tante...

Diciamo che non voglio testare le situazioni "sporche", anche perchè srebbe impossibile, soprattutto per le catene di lock, che sono troppo time-depend. Principalmente volevo esprimere la necessità di inserire la gestione della concorrenza.... L'obiettivo è di essere obbligati dal test ad inserire la gestione della mutua esclusione (immaginatevi di essere in un ambito Test Driven)

Ultima modifica di cionci : 18-10-2006 alle 10:06.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2006, 10:42   #10
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da cionci
Avevo pensato anche io a mockare la classe condivisa, ma è un lavoro dispendioso...soprattutto se le classi condivise sono tante...

Diciamo che non voglio testare le situazioni "sporche", anche perchè srebbe impossibile, soprattutto per le catene di lock, che sono troppo time-depend. Principalmente volevo esprimere la necessità di inserire la gestione della concorrenza.... L'obiettivo è di essere obbligati dal test ad inserire la gestione della mutua esclusione (immaginatevi di essere in un ambito Test Driven)
fai 2 mock thread che "apposta" si sovrappongano (senza syncronize o simili) generando una situazione sporca(RED). Poi aggiungi syncronize e il test dovrebbe andare(GREEN). Poi giu di refactoring
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2006, 11:02   #11
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da thebol
fai 2 mock thread che "apposta" si sovrappongano
Come
Il test ovviamente deve fallire sempre, se non è gestita la mutua esclusione...ma questa condizione non è garantita...

Vediamo forse qualcosa mi viene in mente per testarlo...lo elaboro oggi quando torno a casa... Però mi sa che porta ad un deadlock...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2006, 12:14   #12
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Posto ma solo per espormi al pubblico dileggio!

Teoricamente non faceva una piega. La prima istruzione del metodo acceduto è la registrazione dell'accesso del Thread che accede e l'ultima è la registrazione dell'uscita da parte dello stesso Thread. Quando è registrato un accesso, il registro controlla se il tempo di "entrata" si sovrappone con un periodo di accesso già registrato per un Thread diverso.

Quello che ho scritto, però, non coincide. Un chiaro caso di cervello distribuito: metà in testa e metà nelle dita .

Codice:
public class CriticalAccess {
	private final long acquireTime;
	private final int threadId;
	private volatile long releaseTime;
	
	public CriticalAccess(int threadId, long acquireTime) {
		this.acquireTime = acquireTime;
		this.threadId = threadId;
	}
	
	public boolean hasThreadId(int id) {
		return threadId == id;
	}
	
	public long getAcquireTime() {
		return acquireTime;
	}
	
	public long getReleaseTime() {
		return releaseTime;
	}
	
	public void setReleaseTime(long t) {
		releaseTime = t;
	}
	
	public boolean overlaps(long time) {
		if(releaseTime != 0) {
			return time > acquireTime && time < releaseTime;
		} else {
			return time >= acquireTime;
		}
	}
	
	public String toString() {
		return "ID:"+threadId+"...STARTED:"+acquireTime+"...ENDED:"+releaseTime;
	}
}
Codice:
import java.util.*;

public class CriticalAccessRegistry {
	private final long time0 = System.nanoTime();
	private ArrayList<CriticalAccess> registry = new ArrayList<CriticalAccess>();
	
	private static final CriticalAccessRegistry sharedInstance =
		new CriticalAccessRegistry();
		
	public static CriticalAccessRegistry getSharedInstance() {
		return sharedInstance;
	}

	public void registerAcquire(int threadId) {
		long timeStamp = getTime();
		putAcquire(threadId, timeStamp);
	}
	
	public void registerRelease(int threadId) {
		long timeStamp = getTime();
		putRelease(threadId, timeStamp);
	}
	
	private synchronized void putAcquire(int threadId, long timeStamp) {
		CriticalAccess overlapped = checkOverlaps(threadId, timeStamp);
		CriticalAccess ca = new CriticalAccess(threadId, timeStamp);
		if(overlapped != null) {
			System.out.println(ca + " conflicts with " + overlapped);
		}
		registry.add(ca);
	}
	
	private synchronized void putRelease(int threadId, long timeStamp) {
		CriticalAccess ca = getAccess(threadId);
		if(ca != null) ca.setReleaseTime(timeStamp);
	}
	
	private CriticalAccess checkOverlaps(int id, long time) {
		for(int i = 0; i < registry.size(); i++) {
			CriticalAccess c = registry.get(i);
			if(!c.hasThreadId(id) && c.overlaps(time)) {
				return c;
			}
		}
		return null;
	}
	
	private CriticalAccess getAccess(int threadId) {
		for(int i = 0; i < registry.size(); i++) {
			CriticalAccess c = registry.get(i);
			if(c.hasThreadId(threadId)) return c;
		}
		return null;
	}
	
	private long getTime() {
		return (System.nanoTime() - time0) / 1000000L;
	}
	
	public void dump() {
		for(CriticalAccess c : registry) {
			System.out.println(c);
		}
	}
}
Codice:
import java.util.*;

public class SharedResource implements Runnable {
	private final Random random = new Random();
	
	public void run() {
		while(true) {
			CriticalAccessRegistry.getSharedInstance().
				registerAcquire(Thread.currentThread().hashCode());
			sharedAccess();
			CriticalAccessRegistry.getSharedInstance().
				registerRelease(Thread.currentThread().hashCode());
			if(Thread.currentThread().isInterrupted()) {
				System.out.println("Threadus interruptus!!!");
				return;
			}
		}
	}
	
	public void sharedAccess() {
		try {
			Thread.sleep(100);
		} catch(InterruptedException swallow) {
			Thread.currentThread().interrupt();
		}
	}
}
Codice:
public class Test {

	public static void main(String[] args) {
		long testTime = Long.parseLong(args[0]);
		while(CriticalAccessRegistry.getSharedInstance() == null);
		SharedResource res = new SharedResource();
		Thread a = new Thread(res);
		Thread b = new Thread(res);
		a.start();
		b.start();
		long startTime = System.currentTimeMillis();
		while(System.currentTimeMillis() - startTime < testTime);
		a.interrupt();
		b.interrupt();
	}
}
Sempre teoricamente, il test non è quello previsto da cionci perchè è probabilistico: due thread che accedono alla stessa regione di memoria possono sovrapporsi ma non è detto che lo facciano. Per avere un test deterministico bisognerebbe (credo) conoscere i dettagli degli algoritmi di schedulazione del sistema operativo.

Comunque, quella roba lì sopra "la va no", non funziona.
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 18-10-2006, 12:19   #13
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
Quote:
Originariamente inviato da cionci
Come
Il test ovviamente deve fallire sempre, se non è gestita la mutua esclusione...ma questa condizione non è garantita...

Vediamo forse qualcosa mi viene in mente per testarlo...lo elaboro oggi quando torno a casa... Però mi sa che porta ad un deadlock...
2 thread che si conoscono sincronizzati fra di loro per entrare contemporaneamente

ps.sto ipotizzando a livello astratto, non so quanto sia fattibile in generale, e nel tuo caso..
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 10:41   #14
thebol
Senior Member
 
Iscritto dal: Dec 2000
Città: bologna
Messaggi: 1309
http://en.wikipedia.org/wiki/Monkey_test

qua ipotizza l'utilizzo del monkey test per i thread.

non approfondisce molto, ma magari qualcosa sul web si trova
thebol è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 10:50   #15
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Cioe' si tratterebbe di fare avanzare N thread casualmente in modo di produrre con alta probabilita' un errore ?

Mi sembra una situazione un po' limite, cioe' significherebbe comunque un test che, in caso di codice errato, comunque ha una certa probabilita' di risultare verde...
Pero' magari con un numero elevato di thread questa probabilita' potrebbe essere molto piccola...boh...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 16:20   #16
Angus
Senior Member
 
L'Avatar di Angus
 
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
Quote:
Originariamente inviato da cionci
Cioe' si tratterebbe di fare avanzare N thread casualmente in modo di produrre con alta probabilita' un errore ?

Mi sembra una situazione un po' limite, cioe' significherebbe comunque un test che, in caso di codice errato, comunque ha una certa probabilita' di risultare verde...
Pero' magari con un numero elevato di thread questa probabilita' potrebbe essere molto piccola...boh...
Infatti la vera questione è se questo sia un problema da approcciare con metodologie deterministiche oppure no. Sinceramente non so rispondere, ma a naso scommetterei sull'approccio statistico con il dubbio che qualcosa possa sempre sfuggire.
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer
°SetiEmperor°| Ninja Technologies
{ qualunque cosa sia, è veloce e fa male (cit.) }
Angus è offline   Rispondi citando il messaggio o parte di esso
Old 26-10-2006, 19:19   #17
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Mmmmhhh...sinceramente ancora non mi convince... Cercherò di approcciare la cosa in modo diverso
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2006, 12:48   #18
Angus
Senior Member
 
L'Avatar di Angus
 
Iscritto dal: Dec 2001
Città: Milano
Messaggi: 545
Quote:
Originariamente inviato da cionci
Mmmmhhh...sinceramente ancora non mi convince... Cercherò di approcciare la cosa in modo diverso
Hai già letto questo?
__________________
Angus the Hunter @ Realm of magic | Angus Young @ Batracer
°SetiEmperor°| Ninja Technologies
{ qualunque cosa sia, è veloce e fa male (cit.) }
Angus è offline   Rispondi citando il messaggio o parte di esso
Old 27-10-2006, 15:32   #19
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Sì, l'ho letto qualche giorno fa...
cionci è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Gigabyte MO32U24 OLED: il 4K a 240Hz su un pannello OLED ideale per il gaming Gigabyte MO32U24 OLED: il 4K a 240Hz su un panne...
Recensione realme 16 5G: lo smartphone con Selfie Mirror ha una batteria da 6550mAh Recensione realme 16 5G: lo smartphone con Selfi...
Come rispettare tutte le nuove regole per i monopattini elettrici? La guida per non rischiare sanzioni Come rispettare tutte le nuove regole per i mono...
DLSS 4.5: con Dynamic Frame Generation e MFG 6X NVIDIA alza la posta DLSS 4.5: con Dynamic Frame Generation e MFG 6X ...
Plaud NotePin S, il registratore IA si fa indossabile (ma è facile da perdere) Plaud NotePin S, il registratore IA si fa indoss...
"Prime Day Amazon il 23-26 giugno": sì e...
Oggi 2 super MacBook Pro M5 e M5 Pro, 24...
Tineco Floor One Station S9 Artist: il s...
Raggiunte nuove altitudine e velocit&agr...
Apple Watch Series 11 GPS a 339€ su Amaz...
Come un MacBook, ma con la RTX 5070: MSI...
Paolo Zaccardi: "Smettere di assume...
Finalmente a buon prezzo 2 mini PC con R...
Samsung Galaxy Watch 7: uno crolla a 146...
NVIDIA pronta al 'piano B' per la Cina: ...
Xiaomi TV A Pro 55 a soli 366€: è...
No, i tuoi dati di Pokémon Go non sono f...
XBOX potrebbe diventare una societ&agrav...
Il primo trilionario al mondo ha un nome...
Infineon apre il 2 luglio lo Smart Power...
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: 10:20.


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