Les thread donnent-ils le même résultat à chaque exécution

nasix
Les thread donnent-ils le même résultat à chaque exécution

Salut tout le monde,

J'ai un souci au niveau de l'exécution d'un programme de threads qui est très simple, voici ci-dessous ma classe myThread ainsi que la classe Main :

public class myThread extends Thread {

	public void run() {
		for(int i=0; i<100;i++)
			System.out.println(this.getName() + " : " + i);
	}	
}

public class Main {

	public static void main(String[] args) {
		
		myThread t1 = new myThread();
		myThread t2 = new myThread();

		t1.setName("t1");
		t2.setName("t2");

		t1.start();
		t2.start();
	}
}

Le même programme exécuté plusieurs fois sur deux machines différentes M1 et M2 donne le résultat suivant :
Sur la machine 1 : Toujours le même résultat qui est :
t1 : 0
t1 : 1
...
t1 : 99
t2 : 0
...
t2 : 99

Sur la machine M2 : concurrence entre t1 et t2 et à chaque exécution un nouveau résultat.

Ma question est la suivante :
Pourquoi sur la machine M1, t1 et t2 ne sont pas concurrents, et ils n'ont pas l'air d'être deux processus indépendants ?[/b]

fredericmazue

Quote:
Sur la machine M2 : concurrence entre t1 et t2 et à chaque exécution un nouveau résultat.

Qu'est-ce que tu veux dire par là ? je ne suis pas sûr de comprendre.

Peut être veux tu dire que les sorties émises par les deux threads sont mélangées ? Si oui, tu ne peux pas savoir à l'avance ce qui va se passer sur la machine hôte. En programmation multithread ou concurrente, faut savoir vivre avec ça.

nasix

Bonjour,

Merci de m'avoir répondu.
Sur la machine M2 : concurrence entre t1 et t2 et à chaque exécution un nouveau résultat.

Je veux dire par ça que sur la machine M2, il y a une exécution très normale, on ne peut rien prévoir, chaque exécution donne un résultat différent.

Par contre le problème se pose au niveau de la machine M1, ça donne toujours la même exécution et il n'y a pas de concurrence entre les deux Threads.

fredericmazue

Quote:
on ne peut rien prévoir, chaque exécution donne un résultat différent.

Mais que diable veux tu dire ?

Et surtout quels OS et en quelles versions tu as sur les machines M1 et M2 ?

nasix

Ah, je suis désolé si je vous ai énervé, j'ai cru que j'étais très clair.

J'ai exactement le même environnement dans les deux machines (winXP, eclipse europa, JDK 1.5) avec exactement le même code (déjà cité dans le message 1).

Quand j'exécute ce code, sur la machine M2 ça donne, à chaque exécution, un résultat aléatoire, une bonne interférence entre les deux processus t1 et t2, alors que dans la machine M1, j'ai toujours la même chose, exécution de t1 puis après exécution de t2 et pas d'interférence.

Revoyez le code du message 1 svp pour mieux comprendre.

fredericmazue

Mais je ne suis pas énervé :)

Oui c'est plus clair maintenant

Quote:
J'ai exactement le même environnement dans les deux machines (winXP,

Ca reste à prouver...
Est-ce exactement la même version de XP, avec le même service pack et exactement les mêmes mises à jour ? Est-ce très exactement les mêmes JVM 1.5 ? Lorsque ces JVM ont été construites (par Sun je veux dire), l'édition de liens a-t-elle été effectuées avec exactement les mêmes librairies de runtime C/C++ ?
Est-ce exactement le même hardware et les XP sont-ils configués très exactement pareils ?
Les consoles sont elles configurées avec très exactement la même taille de tampon ?

Pour sûr que dans cette liste il y a une différence.

Mais peu importe ce que c'est...
J'ai essayé de te le dire déjà et je te le confirme ici. TU NE PEUX PAS compter sur un résultat bien défini ou prévisible lorsque deux threads émettent simultanément une sortie sur une console.
Ca fait ce que ça veux faire et c'est tout.
A la limite tu peux adapter le code pour que les threads s'attendent l'un autre mutuellement à tour de rôle (gaffe au deadlock ;) :lol: ) mais même comme ça le résultat ne sera pas 100 % garanti

nasix

Ah, dans ce cas je ne dirais pas que mes deux machines ont exactement le même environnement.

Par contre je ne comprends pas pourquoi dans la machine M1, j'ai toujours la même chose, exécution de t1 puis après exécution de t2 et pas d'interférence(sachant bien qu'il s'agit du même code exécuté sur la machine M2).

Théoriquement je ne peux pas prévoir le résultat, mais pratiquement j'ai toujours le même résultat, t1 puis t2 et pas d'interférence.

ça peut être dû à une mauvaise configuration dans la machine M1 ?

A vrai dire c'est ça ma question.

fredericmazue

Quote:
ça peut être dû à une mauvaise configuration dans la machine M1 ?

Non.... :)

Niroken

Bonjour,

As tu essayé de faire une boucle sur un chiffre un peu plus grand que 100? (par ex 10 000)

Bonne chance,
Niroken

nasix

Salut,

Merci, je vais tester.

loic.guillois_4127

Comme dit plus haut, il n'est pas possible de déterminer le résultat de l'exécution de plusieurs processus sans contrôle.

Quand tu dis que le même programme est exécuté plusieurs fois, cela veut dire que tu lance plusieurs fois la classe Main ou bien ?

Si c'est le cas tu ne peux rien prédire. C'est l'ordonnanceur de tâche de Windows qui prend la main et qui fait ce qu'il veut.

Si ce n'est pas le cas, ton code semble correct donc ce serait un problème de configuration mais je reste sceptique...

willbback

M1 = machine mono core
M2 = machine dual core
N'est-ce pas ?????

Dans le cas d'une mono core, l'ordonnanceur de Windows ne donnerait pas plus de poid aux 2 threads, puisqu'ils font la même chose. Ils seront donc ordonnancés toujours de la même façon.
Dans le cas d'un dual core, les thread peuvent être répartis sur les 2 coeurs, dans ce cas, on a un vrai paralléllisme des tâches. L'occupation de chacun des coeurs n'étant pas équivalente, il y a donc forcément résultats différents.

nasix

Salut et Merci d'avoir répondu,

ça m'a passé cette question de noyau et je n'ai pas vérifié mais je ne pense pas que ça vient de là.
Je veux juste clarifier une chose, je ne prétends rien je veux juste avoir une interprétation du fait que sur la machine M1, plusieurs exécutions réalisées ont donné le même et exactement le même résultat. toujours exécution de thread t1 puis t2. Je sais bien que théoriquement c'est bête de le dire, mais pratiquement c'est le cas dans cette machine.

Bref, je lance le même programme(qui lance 2 threads t1 et t2) sur 2 machines M1 et M2, sur M2 à chaque fois j'ai un résultat différent (et c'est très normal), sur M1 il n'y a même pas la notion de parallélisme, exécution de t1 et puis exécution de t2.
ça je n'arrive pas à l'interpréter.

nasix

Merci Loic,

loic.guillois wrote:
Comme dit plus haut, il n'est pas possible de déterminer le résultat de l'exécution de plusieurs processus sans contrôle.

Oui, c'est très logique et c'est par essence.

loic.guillois wrote:
Quand tu dis que le même programme est exécuté plusieurs fois, cela veut dire que tu lance plusieurs fois la classe Main ou bien ?

Oui c'est ça.

loic.guillois wrote:
Si c'est le cas tu ne peux rien prédire. C'est l'ordonnanceur de tâche de Windows qui prend la main et qui fait ce qu'il veut.

Si ce n'est pas le cas, ton code semble correct donc ce serait un problème de configuration mais je reste sceptique...


Oui mais au moins je peux noter le résultat de plusieurs exécutions, et c'est là que j'ai le problème parce que la machine M1 a toujours donné le même résultat, ceci peut-il être par coïncidence ?
loic.guillois_4127

un coïncidence c'est possible oui... mais as tu les mêmes processeurs sur ces deux machines ? si l'un des deux n'a pas le meme nombre de coeurs ou n'a pas la technologie Hyperthreading, ça peut tout changer.

nasix

Salut,

Niroken:

Quote:
As tu essayé de faire une boucle sur un chiffre un peu plus grand que 100? (par ex 10 000)

Super, je te remercie, j'ai essayé ce nombre et ça a marché.

Donc ça peut être du à la durée de la tranche de temps d'éxécution des threads dans cette machine.

Je ne peux pas le prouver, mais j'en crois fortement.

Merci beaucoup

nasix

salut,

Je ne peux pas le savoir, apparemment j'ai la même configuration, il s'agit des machines d'une classe de TP, je ne pense pas qu'elles soient différentes, déjà elles ont l'aire d'être les mêmes.

nasix

Hello,

Quote:
As tu essayé de faire une boucle sur un chiffre un peu plus grand que 100? (par ex 10 000)

J'ai essayé et ça a marché, nickel !!

Merci Niroken il fallait juste que je donne plus de temps d'exécution au threads pour que je puisse voir la concurrence.

Merci une autre fois.
Salut.

nasix

Salut,

Je pense que les machine ont exactement les mêmes configuration. c'est un parc informatique qui a été équipé par le même commande auprès de siemens.

En fin je pense et je ne suis pas sûr.
Merci pour toutes vos aides.