2011-10-26 2 views
2

J'ai du code qui attend une opération d'écriture sur la mémoire partagée. Si personne n'écrit, il continue d'attendre.Trop de consommation de CPU par boost scoped_lock

Test* Foo::Get() 
    { 
     boost::interprocess::scoped_lock<boost::interprocess::interprocess_mutex> lock (mutex) ; // mutex is boost::interprocess::interprocess_mutex 
     if (this->check == 0) 
      this->interprocessCondition.wait (lock) ; // interprocessCondition is boost::interprocess::interprocess_condition 

... 
    } 

Quand j'ai fait l'échantillonnage, j'ai découvert qu'il consomme environ 90% du CPU. Est-ce que quelqu'un peut m'aider à résoudre ce problème de performance? S'il vous plaît voir l'image ci-jointe.

Screen Shot

+0

Faites-vous autre chose ou ne faites-vous que profiler le verrou? A quoi ressemble le code 'quelque chose d'autre'? –

+0

Sa lecture juste de la mémoire partagée dans quelque chose. J'ai profilé l'exécutable complet. – MacGeek

+2

Cela n'aide pas beaucoup. Il est normal de prendre un verrou pour prendre * beaucoup * plus de cpu que de lire un int de la mémoire partagée. Vous le résolvez en rendant le verrou moins fin. –

Répondre

6

boost::interprocess, malheureusement, utilise occupé en attente des verrous sur de nombreuses plateformes (apparemment, y compris Mac OS X). Vous devez utiliser un verrou natif de votre plate-forme qui dort réellement.

+0

Ou, heureusement, cela dépend de ce que vous voulez réaliser. –

+0

J'ai ajouté sleep (1) à la place de sched_yield(); appel? Maintenant c'est très joli. Est-ce qu'il y aura des effets secondaires, à part que je dois chercher une mise à jour boost qui ne perturbe pas le code? – MacGeek

+0

@MacGeek, cela augmentera considérablement la latence de réveil – bdonlan

Questions connexes