Disons que j'ai le code suivant
static class ...
{
static object myobj = new object();
static void mymethod()
{
lock(myobj)
{
// my code....
}
}
}
5 Réponses :
Mise à jour ma réponse: Ils sont mis en file d'attente, mais l'ordre n'est pas garanti d'être FIFO. P>
Consultez ce lien: http://www.albahaari.com/threading/part2.aspx p>
Pas nécessairement, voir:
Cela attendra, et ils ne seront pas dans le même ordre. P>
Selon vos besoins, vous pouvez avoir plus de performances si vous regardez quelque chose comme un ReaderWriterLock code> ou autre que JUST LOCK P> P> P> P>
Il n'est pas clair à partir de votre code comment À 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 Pour plus d'informations sur les convois de verrouillage, vous devez lire les articles Rick Vicik à Conception d'applications pour hautes performances : p>
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. P>
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 p>
blockQuote> MyOBJ code> est-il visible à l'intérieur myMethod code>. On dirait que var myobj code> est une variable de pile locale à la portée de la déclaration (car est var code>). Dans ce cas, il se peut que chaque thread aura une instance séparée de celui-ci et le myMethod code> ne bloquera pas. P>
Vous êtes correct, c'est un objet statique dans un objet statique, j'ai écrit trop vite. Va le réparer maintenant
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. P>
Pour toutes les fins pratiques, vous pouvez supposer que la commande sera FIFO; Cependant, soyez conscient de ce problème. P>
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