Question

Combien de temps un fil d'attente pour une condition de course dans le scénario suivant?

Un fichier est ajouté à une collection:

 lock(mylock)
 {
     // add to collection
 }

Il est ensuite retiré de la collection d'une manière similaire.

Si un thread tente d'ajouter à la collection alors que le service est le retirer de la collection, qui gagne?

Ou est-ce que le point d'une condition de course, vous ne pouvez pas prédire qui gagne?

Était-ce utile?

La solution

Si le thread essaie de verrouiller la suppression d'abord, il est propriétaire de la serrure, supprime l'élément (si elle existe), libère le verrou, et se déplace. Ensuite, le fil en ajoutant saisit le verrou et ajoute l'élément. Résultat final:. élément existe dans la collection

Si le thread essaie de verrouiller l'ajout d'abord, il possède le verrou, ajoute l'élément, libère le verrou, et se déplace. Puis le fil enlever saisit la serrure et supprime la (juste ajoutée) article. Résultat final:. élément ne pas existe dans la collection

Ni fil attendra plus longtemps que nécessaire pour ajouter ou supprimer un élément de la collection.

Autres conseils

Comme son nom l'indique, une condition de course signifie qu'il ya une course, et tout le monde peut gagner!

Utilisation lock(obj) que vous avez montré ici provoquera le fil à bloquer (attente) jusqu'à ce que tous les autres threads libèrent leur verrou sur obj. Cela peut ne jamais se produire.

lock (obj)
{
    // stuff
}

... équivaut à ...

Monitor.Enter(obj);
try
{
    // stuff
}
finally
{
    Monitor.Exit(obj);
}

Si vous souhaitez appliquer un délai d'attente sur le verrouillage, utilisez ce formulaire à la place:

if (!Monitor.TryEnter(obj, timeout))
{
    // handle the fact that you couldn't lock
}
else
{
    try
    {
        // stuff
    }
    finally
    {
        Monitor.Exit(obj);
    }
}

Quel que soit le fil de la serrure premier gagnera les questions. fil deuxième attendra jusqu'à ce que le premier libère le verrou.

Il y a un autre type de condition de course entre le « si » et « essayer ». Par exemple, si le fil est interrompu juste entre alors il quitte la section de code verrouillé. Je ne pense pas que ce soit le point de votre question, mais il y a encore un problème là-bas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top