2012-03-06 1 views
2

Supposons que nous ayons MethodA et MethodB où les corps des méthodes entières se trouvent dans un seul grand bloc de verrouillage. Les deux méthodes utilisent le même objet pour le verrouillage:Lock() {...} temps d'attente

lock (objectX) 
{ 
    // methodbody 
} 

Plusieurs threads appellent ces deux méthodes.

Deux questions:

  1. Est-il possible de mesurer le temps d'attente total? Y compris: temps nécessaire pour obtenir le verrouillage et le temps requis par le bloc de verrouillage de la méthode "autre" pour terminer l'exécution.
  2. Serait-il plus rapide d'introduire des verrous dans les deux méthodes aux endroits appropriés au lieu d'encapsuler tout le corps de la méthode avec un seul verrou? Je me rends compte que ici je dois mesurer la performance des deux solutions, mais je voudrais entendre votre expérience et des recommandations

Répondre

3

2) Serait-il plus rapide d'introduire les verrous dans les deux méthodes sur les endroits appropriés

Oui. Gardez toujours les segments verrouillés aussi courts que possible. Le verrouillage lui-même est bon marché, ne laissez pas les autres en attente pendant que vous faites des choses non critiques.

1) Est-il possible de mesurer le temps d'attente total? Y compris: temps nécessaire pour obtenir le verrouillage et le temps requis par le bloc de verrouillage de la méthode "autre" pour terminer l'exécution.

Pas exactement je pense. Pour les longues périodes, vous pouvez regarder le temps CPU par rapport au temps écoulé, mais en général: utilisez un bon profileur.

+2

"Toujours garder les segments verrouillés aussi courts que possible." devrait vraiment être "Garder les segments verrouillés aussi courts que possible sans introduire de contention de verrouillage excessive", non? Prendre un verrou n'est pas une opération à coût nul. –

+0

@ChrisShain Monitor.Enter() est très bon marché lorsqu'il n'y a pas de conflit. Mais oui, de très petits segments n'est pas une bonne idée non plus. C'est un compromis entre le changement de contexte et l'attente inutile. –

+0

"Toujours garder les segments verrouillés aussi courts que possible." Je pense qu'il est bon de souligner que vous ne devriez jamais les raccourcir. Si vous devez effectuer une opération atomique à l'aide de 'lock', vous devez inclure toute l'opération dans ce' lock', non divisé en plusieurs segments. – svick