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.

OriginalL'auteur Megacan | 2010-05-12