2010-07-05 20 views
0

J'apprends la programmation multi-threads; et tout en pratiquant mutex, je remarque qu'il semble ne fonctionne pas correctement sur mon ordinateur portable dule-core.Java mutex avec smp

Le code mutex est à http://pastebin.com/axGY5y3c

Le résultat est comme ci-dessous:

count value:t[0]1 
count value:t[1]1 
count value:t[2]2 
count value:t[3]3 
count value:t[4]4 

Le résultat montre que les fils seemly obtiendrait la même valeur d'initialisation au début. Cela semble incorrect.

Y at-il un problème avec mon code? Ou y a-t-il des ressources fournissant des exemples sur l'exécution de java mutex sur smp/dule-core/multiple cpus?

Merci pour votre aide.

Répondre

1

Je ne suis pas très familier avec les algorithmes mutex, donc je ne peux pas vous aider strictement concernant la concurrence. Je ne, tache cependant une ligne dans votre code qui explique pourquoi vous obtenez les valeurs que vous avez énumérés:

public class MyThread extends Thread{ 
    // [...] 
    private static int count = 0; 

Lorsque vous démarrez quatre fils, run() est appelé quatre fois, incrémenter count chaque itération.

Ce bloc de code:

t[i].start(); 
int v = t[i].getCountValue(); 
System.out.println("count value:t["+i+"]"+v; 

est donc efficace:

count++; 
System.out.println("count value:t["+i+"]"+count); 
+0

De plus, à la ligne 54, vous impliquez 'this.count', alors que' count' est statique. –

1

Comme Paul l'a dit, vous avez la confusion qui "compte" est déclarée comme statique, mais lorsque vous reprendrez Cela implique que vous ne voulez pas que ce soit statique. Fondamentalement, vous devez décider ce que vous voulez que le programme fasse.

Mais ... dans tous les cas, il y a d'autres questions:

  • dans votre implémentation, vous accédez à des structures de données partagées entre les threads (chaque thread peut avoir son propre élément de tableau, mais le tableau réel la référence est partagée entre les threads); selon le modèle de mémoire Java, vous devez prendre des mesures pour sécuriser cette opération (par exemple, déclarer les tableaux final ou volatile ou utiliser un tableau atomique);
  • Il existe des bibliothèques de simultanéité standard qui peuvent réellement mieux fonctionner en pratique (ou au moins être correctes et plus flexibles), bien que bien sûr, en tant qu'exercice académique, comprendre les algorithmes concurrents n'est pas une mauvaise chose.
0

Je pense que je connais à peu près le problème de mon code. La ligne imprimée dans Test.java contient la fonction getCountValue(), qui n'est pas dans la limite de lock (mutex.lock()/mutex.unlock()); par conséquent, lorsque le thread commence à imprimer la valeur de comptage, il en résulte une condition de concurrence, car l'impression de la valeur de comptage ne doit pas attendre l'autre thread. Après avoir déplacé getCountValue() à l'intérieur de la fonction run(), qui est à l'intérieur de la limite du verrou. Le résultat semble correct. Il imprime

pid:0 count value:1 
pid:2 count value:2 
pid:3 count value:3 
pid:1 count value:4 
pid:4 count value:5 

Merci encore pour votre aide. Je l'apprécie.