2010-08-11 6 views
2

Hautement, il y a un problème dans cette serrure, mais je ne pouvais pas comprendre ce que c'est. J'ai fortement suspect que l'exemple ci-dessous ne bloque pas assez bien. Alors, quel peut être un problème?Quel est le problème sur ce verrou?

class example 
{ 
    object locker = new object(); 
    void start() 
    { 
     for (int i = 0; i < 1000; i++) 
     { 
      (new Thread(dostuff)).Start(); 
     } 
    } 
    void dostuff() 
    { 
     lock (locker) 
     { 
      //dosomething 
     } 
    } 
} 
+2

Vous devez expliquer un peu plus ce que vous essayez de faire et pourquoi cela ne fonctionne pas comme prévu. Pour un - voulez-vous que tous les 1000 threads agissent sur le même objet (ce qui n'a probablement pas de sens pour 1000 threads à faire), ou sont-ils censés agir sur des objets potentiellement différents? –

+0

discussions sur le même objet – Freshblood

+0

Pourquoi la question a-t-elle été votée pour fermer? – Freshblood

Répondre

3

Votre code crée 1000 threads. C'est énormément cher, nécessitant plus de 1 Go de mémoire.

Ensuite, tous ces threads sont en concurrence pour un seul verrou, ce qui consiste essentiellement à sérialiser (dé-threader) toute l'opération.

Mais votre verrouiller fonctionne très bien, rien à redire ici. C'est juste que lorsque vous exécutez cette application il pourrait sembler que votre PC plante.


Notez également que l'objet que vous essayez de protéger doit être lié 1-à-1 avec l'objet locker. Mais pour une meilleure réponse, vous devrez poster un code un peu plus complet et peut-être plus proche de la réalité.

+0

Cela n'a pas de sens et d'inspection encore ce qui a causé des résultats étranges – Freshblood

+0

Je ne suis pas sûr où vous rassemblez cela nécessitant plus de 1 Go de mémoire. Il ne s'agit que de 1 000 threads, donc vous supposez qu'il acquiert au minimum 1,02 Mo par thread? –

+0

@Gary: C'est la taille de pile par défaut. –

4

Il semble que vous développez 1000 threads, puis verrouillez chacun d'eux. Cela signifie que le code dans dostuff (qui vit dans la section lock) s'exécutera séquentiellement au lieu de le faire en même temps. Comme il est écrit, il serait plus efficace d'appeler directement dostuff() directement dans la boucle for.

+0

C'est juste un exemple pour démontrer mon problème spécifique. Il est déjà prévu de verrouiller mais mon application montre que le verrou ne fonctionne pas alors j'obtiens des résultats inattendus. – Freshblood

+2

Alors, quelle est votre application qui vous indique que le verrou ne fonctionne pas? – RQDQ

+0

Je ne veux pas dire le côté spécifique de mes codes, mais je ne peux pas comprendre ce qui cause les résultats inattendus dans mon application. Il y a juste une instance de classe exemple donc le code écrit n'a pas de problème non? – Freshblood

2

Je ne sais pas exactement ce que vous faites ici, mais vos 1000 threads fonctionneront en série. Défait l'objectif des discussions en premier lieu.

Votre méthode "dostuff" se verrouille immédiatement sur toute la longueur du filetage. Le thread se déverrouille alors, et le prochain thread en ligne peut commencer à traiter (et verrouille ...)

2

Je ne suis pas sûr de ce que votre problème est-- ce code va démarrer dostuff 1000 fois, mais le code dans la serrure n'en exécutera qu'un seul à la fois.

Le seul problème que vous pourriez avoir avec le verrou est si vous devez exécuter le code seulement un à la fois quel que soit le nombre de copies de la classe exemple que vous avez créé. Si cela est important, vous devez rendre l'objet locker statique.