6
votes

Fils de signalisation dans la condition d'une serrure

J'ai pris les points suivants de cette API et j'aimerais connaître la différence entre les 2 points suivants:

  1. Les fils d'attente sont signalés dans l'ordre FIFO.

  2. la commande de la réacquisition de verrouillage pour les fils revenant de Les méthodes d'attente sont les mêmes que pour les threads acquérir initialement le Verrouiller, qui se trouve dans le cas par défaut non spécifié, mais pour des serrures équitables favorise ces threads qui attendent le plus long.

    Il est lié à de la classe qui est généralement renvoyé par la méthode ReentrantLock .Newconition () , et le bit que j'ai cité, il explique la différence entre les méthodes de < Code> Condition et les méthodes de moniteur ordinaires de la classe d'objets.

    "Les fils d'attente sont signalés dans l'ordre de la FIFO". Je pense que tant que le verrouillage est créé de manière équitable ou non, le fait que les filets d'attente soient signalés dans une commande FIFO est totalement non pertinent. Parce que de toute façon, il est de savoir s'ils ont été construits, équitables ou non, ce qui décide comment ils sont mis en file d'attente.

    Demander simplement une confirmation.

    Merci d'avance.


0 commentaires

3 Réponses :


1
votes

S'il vous plaît voir ci-dessous les réponses à vos questions:

1. Les threads d'origine sont signalés dans l'ordre FIFO.

Lorsque nous invoquons une méthode de condition attendue (), le fil passe dans l'état d'attente, la déclaration ci-dessus fait référence à la manière dont ces threads en attente sont signalés. Donc, si les threads T1 sont allés à l'état d'attente avant T2, T1 sera signalé avant T2.

2.Le commande de repérage de verrouillage pour les threads revenir à partir de méthodes d'attente est la même que pour les threads acquérir initialement la serrure, qui figure dans le cas par défaut non spécifié, mais pour les verrous équitables favorise ces threads qui attendent le plus long.

Continuation de la déclaration ci-dessus, lorsque le fil d'attente est signalé, il a tendance à revenir à la serrure. Bien que la déclaration ci-dessus indique que T1 soit signalée avant T2, mais lorsqu'il s'agit de réactiver le verrouillage, l'ordre de réacquisition utilise des concepts définis par verrouillage. Donc, cela dépend de la création de l'objet de verrouillage. Lors de la création de verrouillage, vous avez peut-être spécifié un paramètre d'équité:

reentrantlock (foire booléenne)

Si oui, ce paramètre est utilisé, sinon le comportement des verrous par défaut se produit, vous pouvez en savoir plus sur les serrures de retrantlock sur ce link

Il pourrait y avoir plus d'explications à ces déclarations, vient d'essayer de mieux comprendre mon compréhension ici. En espérant avoir été capable de clarifier.

acclamations !!


0 commentaires

0
votes

Tant que le verrouillage est créé soit juste, soit non, le fait que les fils d'attente sont signalés dans une commande FIFO est totalement non pertinent, n'est-ce pas? Parce que de toute façon, il est de savoir s'ils ont été construits, équitables ou non, ce qui décide comment ils sont mis en file d'attente.

Je pense que c'est pertinent.

Considérez un scénario sur lequel T1 et T2 attendent une condition C (avec T1 attente plus longtemps que T2), T3 fonctionne à l'intérieur du moniteur et T4 attend son acquisition de serrure initiale. T3 signaux C et laisse le moniteur relâchant la serrure. Supposons que non parasidie ​​WakeUp se produisent.

Si la serrure est Fair , T4 va certainement acquérir la serrure avant T1, mais le fait que les fils d'attente soient signalés dans l'ordre FIFO vous garantissent que T1 acquérira la serrure avant T2.

En outre, si la serrure est pas juste , nous ne pouvons pas dire quel thread va acquérir la serrure d'abord entre T1 et T4, mais à nouveau, le fait que les fils d'attente soient signalés dans l'ordre de FIFO garantit que T1 va acquérir la serrure avant T2, à condition qu'aucun autre signal ne se produise tant que T1 acquiert la serrure (par exemple au cas où T1 est responsable de la signalisation suivante).


0 commentaires

0
votes

Je pense que le code source peut nous donner plus d'indices sur la façon dont cela fonctionne. reentrantlock.Newconition () Renvoie une ConditionObject dans abstractotiesseSynchroniseur . Voici le lien de code source Code source AQS .

1. Les threads d'origine sont signalés dans l'ordre FIFO.

Il y a deux files d'attente dans abstractostueSuceSynchroniseur .

one est destiné à attendre la serrure (appelez simplement la file d'attente de blocage de verrouillage), vous verrez deux variables volatiles tête et queue abstractotiesseSynchroniseur La définition de classe de la fidèle affectera le comportement de ce file d'attente. Lorsque vous êtes un nouveau foire reentrantlock et appelez Acquérir , AQS appellera FAIRSYNC 'S TRACACQUIRE Pour vérifier si le thread actuel est le premier fil en attente de la file d'attente d'attente de verrouillage, voir HASQUEUEUVEDEDÉDORSSORSSORS .

Une autre file d'attente est la file d'attente du signal dans la définition de ConditionObject , vous verrez deux variables FirstWaiter et lastwaiter .Quand attendre est appelé, un nœud ajoutera à la queue de la file d'attente et lorsque le signal est appelé est appelé, un nœud de la tête sera résolu et ajoutera à la file d'attente d'attente de verrouillage pour réacquérir la serrure. Ajouter à la queue d'attente de verrouillage ne veut pas dire que cela se réveillera, mais une serrure.unlock () sera appelée après signal , qui réveillera les serveurs, Voir UnfarkscSuccessor .

2.Le commande de repérage de verrouillage pour les threads revenir à partir de méthodes d'attente est la même que pour les threads acquérir initialement la serrure, qui figure dans le cas par défaut non spécifié, mais pour les verrous équitables favorise ces threads qui attendent le plus long.

Réveillez-vous de la méthode attendre ne voulait pas tenir la serrure, elle appellera acquérir pour réacquérir la serrure et pourrait être garée à nouveau. Dans ma compréhension, l'ordre d'acquérir initialement la serrure est identique à l'ordre d'appel attendre , de sorte que l'ordre d'appel acquérir , ce qui m'a confondu était < Strong> mais pour les salons justes favorise ces threads qui attendent le plus longtemps. , lorsque vous vous réveillez de attendre , à mon avis, ce sera le premier fil de la file d'attente de verrouillage , Quand appelez acquérir et vérifier p == tête && tryacquire (arg) , foire de verrouillage ou non n'a aucun effet.

J'espère que cela vous aidera et laissez-moi si je me trompe.


0 commentaires