Comment correctement détruire pthread mutex

Exactement comment je peut détruire un pthread mutex variable ?

Voici ce que je veux faire.
Je veux avoir des objets (variables de structure) mis en cache , qui sont considérés par clé.
Je veux avoir un minimum de granularité de serrures ici. Donc je veux avoir un verrou pour chaque
objet probablement incorporé dans la structure, de sorte que je peux avoir au niveau de l'objet de verrouillage.

Maintenant, le problème est de savoir comment détruire en toute sécurité de ces objets ?
Regarde comme la première étape consiste à retirer l'objet à partir de la table de recherche de sorte que l'objet n'est pas
accessible à l'avenir, c'est très bien.

Je veux libérer l'objet de la cache.
Maintenant comment détruire/gratuit mutex correctement ?
pthread_mutex_destroy document nous dit de ne pas utiliser le pthread_mutex_destroy tandis que le mutex est verrouillé. Disons un thread décide de détruire l'objet qu'il a besoin de détruire l'
de verrouillage de sorte qu'il libère le verrou et un pthread_mutex_destroy. Ce qui arrive aux autres threads en attente pour les objets de verrouillage ?

Voici le code pour simuler la remarque ci-dessus , j'ai utilisé du sommeil(2) pour magnifier l'effet de
de course .


#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>

typedef struct exampleObj {
   pthread_mutex_t mutex;
   int key;
   int value1;
   int value2;
}exampleObj;

exampleObj sharedObj = {PTHREAD_MUTEX_INITIALIZER,0,0,0};

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 

exampleObj* Lookup(int key) {
   return &sharedObj;
}

void* thrFunc(void* id) {
   int i = (*((int*)id));
   char errBuf[1024];
   exampleObj * obj = Lookup(0);

   if (pthread_mutex_lock(&obj->mutex)) {
      printf("Locking failed %d \n",i);
      return NULL;
   }
   //Do something
   printf("My id %d will do some work for 2 seconds.\n",i);
   sleep(2);
   pthread_mutex_unlock(&obj->mutex);
   int errNum = pthread_mutex_destroy(&obj->mutex);
   strerror_r(errNum,errBuf,1024);
   printf("Destroying mutex from thread %d : %s\n ",errNum,errBuf);
   return NULL;
}

int main() {
   pthread_t thrds[10];
   int i;
   int args[10];
   char errBuf[1024];
   int errNum = 1;

   for (i=0;i<10;i++){
      args[i] = i;
      pthread_create(&thrds[i],NULL,thrFunc,args+i);
   }

   for (i=0;i<10;i++){
      pthread_join(thrds[i],NULL);
   }
   return 0;
}

Plusieurs threads réussit à détruire le mutex. Et les autres threads accrocher pour toujours.
Gdb montre ces threads sont en attente pour le verrouiller.

Dans votre exemple, tous les threads tentent exclusif fetch-utilisation-détruire à partir du cache, prévue pour le premier thread de bloquer tous les autres. Est-ce la façon dont vous voulez que le cache se comporter dans la vraie demande? Si deux threads tentent une extraction d'un même objet à partir de la mémoire cache, l'un est bloqué jusqu'à ce que ... l'autre détruit l'objet?
Pas dans la vraie application il l'habitude de travailler comme ça. Utilisation réelle sera la recherche de l'objet et à le lire ou écrire verrou de l'objet et de l'utilisation et de libérer le verrou. J'ai voulu tester juste la partie où un thread par exemple est à court d'espace de cache, il a besoin de détruire un objet dans l'ordre de ramener quelques autres objets dans le cache. C'est le scénario que j'avais un doute , il suffit donc simulé ce scénario sommeil(2) est, assurez-vous il y avait assez de temps pour les autres threads d'attendre de verrouillage , de sorte que cela simule détruire quand les autres threads sont en attente.

OriginalL'auteur Sridhar V | 2013-06-18