2010-02-26 4 views
2

Dans l'un de mes fichiers de code, l'une des variables globales qui doit être mise à jour par presque toutes les procédures de ce fichier est verrouillée et déverrouillée avec mutex à chaque fois et à chaque endroit. À mon avis, une trop grande synchronisation avec le verrouillage et le déverrouillage du mutex ralentit nettement la performance. Donc, Ma question est que comment puis-je gagner au niveau de la performance ou comment puis-je réduire l'utilisation de mutex?comment réduire l'utilisation du mutex dans mon code C?

J'espère que ma question est claire sinon laissez-moi savoir. Je vais essayer d'être plus clair.

+1

Les réponses ci-dessous sont excellentes étant donné les détails que vous nous avez fournis. Si vous voulez des réponses plus spécifiques, essayez de poster des parties pertinentes de votre code ... –

+0

Notez que les réponses de Patrick et mouviciel aboutissent au même résultat - évitant le besoin de mutex en éliminant la concurrence difficile, mais par des moyens différents. –

+0

Vous obtiendrez une meilleure réponse si vous nous dites quel type de variable est et ce que les mises à jour signifient sémantiquement. Il peut y avoir de meilleurs moyens de résoudre le problème que vous avez. –

Répondre

4

Si vous utilisez Windows et que la synchronisation est uniquement requise dans votre application, utilisez CriticalSection à la place. C'est beaucoup plus rapide qu'un Mutex.

+1

+1: bonne réponse. Notez que les sections critiques sont une caractéristique standard de la programmation système.Il existe pour tous les systèmes d'exploitation (enfin, peut-être pas le système d'exploitation Lisp Machine?). Les articles de Wikipedia sont une bonne intro: http://en.wikipedia.org/wiki/Critical_section –

0

Vous pouvez éliminer les opérations de mutex pour séparer les fonctions afin de rendre le code plus propre. Mais vous ne pouvez pas enregistrer sur les opérations elles-mêmes - soit vous avez besoin et utilisez la synchronisation ou vous n'avez pas besoin et ne l'utilisez pas.

1

Avez-vous profilé votre code pour voir qu'il passe trop de temps à verrouiller et déverrouiller le mutex? N'essayez pas d'optimiser jusqu'à ce que vous ayez. L'optimisation sans données concrètes est généralement un effort inutile.

En supposant que:

  • que vous avez vérifié que les opérations de mutex sont un coup non négligeable de la performance; et
  • vous ne pouvez pas rendre la résolution du mutex plus fine (par exemple, séparer les mutex pour réduire la contention, peu probable puisque vous parlez de une variable).

Vous pouvez vous intéresser aux fonctionnalités spécifiques au système d'exploitation telles que les incréments atomiques et les décréments sans mutex. Ceux-ci ne seront pas portables C mais vous pouvez utiliser des définitions pour cibler des fonctions spécifiques du système d'exploitation (Interlocked* pour Windows et les appels GCC __sync_* sont là où je chercherais en premier).

+0

Eh bien, puisque la question dit «l'une des variables globales qui doit être mise à jour par presque toutes les procédures dans ce fichier», cela suggère que déplacer les mutex hors de la partie principale du code est simplement une bonne conception, pas une optimisation prématurée. –

0

Si votre application peut être refactorisée de sorte qu'elle n'utilise qu'un seul thread, mutex n'est plus nécessaire.

0

Remplacez certaines de vos structures de données mutables partagées entre les threads par des versions immuables. Les structures de données immuables sont toujours thread-safe. (Le changement que vous faites une nouvelle copie.) Cela change fondamentalement la vitesse pour la simplification du code.