8
votes

Les discussions attendent-elles une serrure FIFO?

Disons que j'ai le code suivant

static class ...
{
    static object myobj = new object();

    static void mymethod()
    {
        lock(myobj)
        {
            // my code....
        }
    }
}


0 commentaires

5 Réponses :


8
votes

Mise à jour ma réponse: Ils sont mis en file d'attente, mais l'ordre n'est pas garanti d'être FIFO.

Consultez ce lien: http://www.albahaari.com/threading/part2.aspx


1 commentaires

Pas nécessairement, voir: Stackoverflow.com/questions/961869/...



-1
votes

Cela attendra, et ils ne seront pas dans le même ordre.

Selon vos besoins, vous pouvez avoir plus de performances si vous regardez quelque chose comme un ReaderWriterLock ou autre que JUST LOCK


0 commentaires

3
votes

Il n'est pas clair à partir de votre code comment MyOBJ est-il visible à l'intérieur myMethod . On dirait que var myobj est une variable de pile locale à la portée de la déclaration (car est var ). Dans ce cas, il se peut que chaque thread aura une instance séparée de celui-ci et le myMethod ne bloquera pas.

mise à jour

À propos de l'ensemble de l'argument de la FIFO, certaines informations de base sont nécessaires: le CLR ne fournit pas la syncronisation. C'est le CLR HOST qui fournit ce service au runtime CLR. L'hôte implémente iHOSTSYNCANAGER et autres interfaces et fournit les différentes primitives de la synchronisation. Cela peut sembler irelà que l'hôte le plus courant est l'hôte d'application typique (c.-à-d. Si vous compilez dans et exe), ce qui éloigne toute la synchronisation au système d'exploitation (vos anciens primitives de livre de Petzold dans Win32 API). Cependant, il existe au moins deux autres évènements d'hébergement majeurs: l'ASP.NET ONE (Je ne suis pas sûr de ce que cela fait) et SQL Server. Ce que je peux dire, c'est que SQL Server fournit toutes les primitives sur TOOP du SOS (qui est fondamentalement un utilisateur plus d'exploitation), ne touche jamais les primitifs du système d'exploitation, et les primitives SOS sont injustes par conception pour éviter les convois de verrouillage (c.-à-d. Guranteed no FIFO). Comme le lien dans l'autre réponse a déjà signalé, les primitives du système d'exploitation ont également commencé à fournir un comportement injuste, pour la même raison d'éviter les convois de verrouillage.

Pour plus d'informations sur les convois de verrouillage, vous devez lire les articles Rick Vicik à Conception d'applications pour hautes performances :

convoi de verrouillage

serrures FIFO garantissent l'équité et avancer les progrès au détriment de provoquant des convois de verrouillage. Le terme initialement signifiait plusieurs threads exécuter la même partie du code que un groupe entraînant des collisions plus élevées que s'ils ont été distribués au hasard tout au long du code (beaucoup comme Les automobiles sont regroupés en paquets par des feux de circulation). Le particulier phénomène je parle est pire parce qu'une fois qu'il forme la implicite transfert de la propriété de verrouillage garde le Fils dans l'étape de verrouillage.

illustrer, considérez l'exemple où un fil tient un verrou et il se fait préempté tout en maintenant la serrure. Le résultat est tous les autres threads va s'empiler sur la liste d'attente pour ça fermer à clé. Quand le fil préempté (verrouillage le propriétaire à la fois) commence à courir et libère la serrure, il la propriété des mains automatiquement de la Verrouillage du premier fil à l'attente liste. Ce fil peut ne pas courir pour un peu de temps, mais l'horloge "Hold Time" est coché. Le propriétaire précédent demande généralement le verrou à nouveau avant La liste d'attente est effacée, Perpétuer le convoi


1 commentaires

Vous êtes correct, c'est un objet statique dans un objet statique, j'ai écrit trop vite. Va le réparer maintenant



0
votes

Windows et le CLR tentent de leur mieux pour garantir l'équité (l'ordre FIFO) de l'attente. Cependant, il existe certains scénarios où l'ordre des threads en attente d'une serrure peut être modifié, surtout tournant autour d'attentes aléables et de tout verrouillage du fil CLR met le fil en état altéril.

Pour toutes les fins pratiques, vous pouvez supposer que la commande sera FIFO; Cependant, soyez conscient de ce problème.


0 commentaires

1
votes

Un exemple simple nous dire que l'ordre n'est pas garanti d'être FIFO

Process Lock Reached: 15
Process Lock Enter: 15
DoWork Lock Reached: 12
Process Lock Reached: 17
DoWork Lock Reached: 11
DoWork Lock Reached: 10
DoWork Lock Reached: 13
DoWork Lock Reached: 9
Process Lock Reached: 18
Process Lock Reached: 14
Process Lock Reached: 16
Process Lock Exit: 15
Thread Lock Enter: 9
Thread Lock Exit: 9
Process Lock Enter: 14
Process Lock Exit: 14
Thread Lock Enter: 10
Thread Lock Exit: 10
Thread Lock Enter: 11
Thread Lock Exit: 11
Process Lock Enter: 16
Process Lock Exit: 16
Thread Lock Enter: 12
Thread Lock Exit: 12
Process Lock Enter: 17
Process Lock Exit: 17
Thread Lock Enter: 13
Thread Lock Exit: 13
Process Lock Enter: 18
Process Lock Exit: 18


0 commentaires