Verrouiller un mutex plusieurs fois dans le même thread
Je suis du développement d'une application sur un linux embarqué OS (uClinux) et j'ai besoin d'être en mesure de verrouiller le mutex plus d'une fois (par le même sujet).
J'ai un mutex et un mutexattr défini et initialisé de la façon suivante:
pthread_mutexattr_t waiting_barcode_mutexattr;
pthread_mutex_t waiting_barcode_mutex;
pthread_mutexattr_init(&waiting_barcode_mutexattr);
pthread_mutexattr_settype(&waiting_barcode_mutexattr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&waiting_barcode_mutex, &waiting_barcode_mutexattr);
Mais quand j'essaie d'acquérir le verrou deux fois il bloque sur la deuxième verrou:
pthread_mutex_lock(&waiting_barcode_mutex);
pthread_mutex_lock(&waiting_barcode_mutex);
Suis-je initialisation du mal ou est-il une meilleure façon de réaliser le même travail?
Merci d'avance.
Conclusions:
- Apparemment PTHREAD_MUTEX_RECURSIVE ou PTHREAD_MUTEX_RECURSIVE_NP ne fonctionne pas donc je ne peux pas créer un réentrant mutex.
- try_lock n'est pas bon non plus. Il acquiert la serrure si elle peut et renvoie une erreur si il ne peut pas acquérir le verrou. Malheureusement, l'erreur viens de m'informe que le mutex est déjà en cours d'utilisation et je ne peux pas savoir si le thread courant est déjà propriétaire du verrou ou pas.
- pthread_mutex_lock peut retourner une erreur si le thread courant a la serrure, mais pour cela j'ai besoin de créer un mutex de type PTHREAD_MUTEX_ERRORCHECK, et je ne peux pas créer une autre.
Pourquoi essayez-vous de verrouiller plus d'une fois? Habituellement, les mutex sont utilisés de sorte que seulement une partie du code peut avoir de la serrure à un moment donné.
Fondamentalement attaché à son la manière dont j'ai mis le code et les fonctions auxiliaires. Peut-être que je devrais changer mon code et à éviter ce. De toute façon, je suis curieux.
Êtes-vous de vérifier de retour de la valeur de l'attribut et les mutex les appels d'initialisation? Se pourrait-il que votre libc juste ne prend pas en charge récursive serrures?
Êtes-vous essayer d'utiliser les sémaphores ( en.wikipedia.org/wiki/Semaphore_(programmation%29, minek.com/files/unix_examples/semab.html )?
Je commençais à oublier de tester les retours, mais je les ai testés et ils sont tous de retour 0. @Brian: Non, je ne suis pas en train d'utiliser les sémaphores.
Fondamentalement attaché à son la manière dont j'ai mis le code et les fonctions auxiliaires. Peut-être que je devrais changer mon code et à éviter ce. De toute façon, je suis curieux.
Êtes-vous de vérifier de retour de la valeur de l'attribut et les mutex les appels d'initialisation? Se pourrait-il que votre libc juste ne prend pas en charge récursive serrures?
Êtes-vous essayer d'utiliser les sémaphores ( en.wikipedia.org/wiki/Semaphore_(programmation%29, minek.com/files/unix_examples/semab.html )?
Je commençais à oublier de tester les retours, mais je les ai testés et ils sont tous de retour 0. @Brian: Non, je ne suis pas en train d'utiliser les sémaphores.
OriginalL'auteur Megacan | 2010-05-12
Vous devez vous connecter pour publier un commentaire.
N'est-ce pas faire ce que vous attendez?
Le premier appel acquiert la serrure, et la deuxième bloc jusqu'à ce que le premier verrou est libéré (
pthread_mutex_unlock
). C'est ce que les verrous ne.À partir de la documentation:
"Si le mutex est déjà verrouillé, le thread se bloque jusqu'à ce que le mutex soit disponible."
Peut-être vous voulez
pthread_mutex_trylock
? Il est difficile de dire si nous ne savons pas ce que vous essayez d'accomplir.CORRECTION:
Je ne savais pas que vous étiez réglage PTHREAD_MUTEX_RECURSIVE.... Permettez-moi de penser à ce un peu plus.
APRÈS RÉFLEXION:
De fouiller google codesearch, il ressemble à PTHREAD_MUTEX_RECURSIVE n'est pas mis en œuvre dans toutes les libs. Vous pouvez essayer de PTHREAD_MUTEX_RECURSIVE_NP, ou vous peut avoir quelque chose de fantaisie pour contourner ce problème.
OriginalL'auteur Jeff B
Il sonne comme le pthread mutex n'est pas réentrant. Vous pouvez travailler autour de ce avec un drapeau indiquant si votre fils a déjà verrouillé le mutex:
pthread_mutex_trylock
est pour.OriginalL'auteur atk
Voici de travail code testé sur UBUNTU 12.04 LTS sur mon Dell sur m6300:
Ne pas oublier de libérer le mutex autant de fois que vous l'avez acquis.
OriginalL'auteur Sam
De SORTIE:
OriginalL'auteur Sammy
(Viens de réaliser que je n'ai pas de marque de cette question une réponse)
Prises à partir de ces Conclusions à la question:
OriginalL'auteur Megacan