FAQ: Reconnaitre un “Lock Convoy”

Il est parfois plus rapide de reconnaitre un problème de parallélisme en observant un graphe engendré par l’analyseur de performance de Visual Studio 2010. Par exemple le schéma ci-dessous:

image

Ce schéma illustre le cas d’un “Lock" Convoy” symbolisé par une alternance exclusive de temps d’exécution (vert) et de temps de synchronisation (rouge). Ceci arrive lorsqu’un thread obtient l’exclusivité d’une ressource partagée, alors les autres threads sont bloqués en attente de cette ressource. A un instant t, il n’y a qu’un thread qui s’exécute, tous les autres attendent, ce qui est parfaitement représenté sur le schéma. Le code responsable de ce graphe est ci-dessous :

object syncObj = new object();

for (int p = 0; p < Environment.ProcessorCount; p++)
{
    new Thread(() =>
    {
        for (int i = 0; i < 50; i++)
        {          
            for (int j = 0; j < 1000; j++)  { /* Work */};
            
            lock (syncObj)
                for (int j = 0; j < 100000000; j++)  { /* Work */ }
        }
    }).Start();
}

Le Lock Convoy est considéré comme un Anti Patterns en parallélisme.

A bientot,

Bruno

boucard.bruno@free.fr