2011-06-27 6 views
0

Pouvez-vous me aider à comprendre comment utiliser les mutex dans multithread application Linux, où:mutex dans multithread application Linux

  • lors de l'écriture de données, il est nécessaire de verrouiller variable écriture et de lecture
  • lors de la lecture de données de la variable, il est nécessaire de le verrouiller sur écrire.

Il est donc possible de lire simultanément, mais l'opération d'écriture est une opération unique en même temps. Pendant l'écriture, toutes les autres opérations doivent attendre avant la fin.

Répondre

3

Vous vous demandez quelque chose qui est un peu plus haut que les mutex. Un mutex est un périphérique simple de bas niveau. Lorsque vous verrouillez un thread avec un mutex, le processeur exécute du code dans le thread qui a obtenu le verrou ou exécute un autre processus entièrement. En d'autres termes, le mutex a verrouillé tous les autres threads qui appartiennent au même processus (poids lourd).

Vous demandez au sujet d'un verrou en lecture-écriture. Les verrous en lecture-écriture utilisent des mutex sous le capot. Les fonctions POSIX qui traitent des verrous en lecture-écriture commencent par pthread_rwlock_. Puisque vous êtes sur une machine Linux, tapez simplement man pthread et recherchez la section intitulée "LECTURE/ECRIRE DES ROUTINES DE VERROUILLAGE".

0

Vous aurez besoin d'utiliser mutex, si vous avez des objets globaux ou statiques qui sont accessibles (lues et écrites) de fils différents.

1

Vous avez besoin d'un verrou de lecture/écriture pour permettre à plusieurs lecteurs/seul écrivain.

Boost.Thread a un de ces (boost::shared_mutex), si vous avez pas d'autre bibliothèque de threads préféré. Cela utilise les primitives PThreads sous les couvertures, et vous fera probablement gagner du temps en enveloppant vous-même les API brutes. Je ne recommanderais pas de l'implémenter vous-même - il est facile d'obtenir quelque chose qui semble fonctionner, mais sous charge se bloque ou tue les performances ou (pire de tout) modifie silencieusement vos données comme il se doit, de sorte que vous obtenir de mauvais résultats.

Un simple boost::mutex peut également être utilisé ici comme l'a noté @Als, mais ne permettra pas à lire en même temps multiple. Cela est plus simple à mettre en œuvre et peut suffire à vos besoins, en fonction de votre profil d'accès en lecture/écriture.

Questions connexes