2017-05-26 2 views
-2

Je cette struct:Vecteur de pthread_mutex_t me donne la même adresse pour tous mutex

struct thread_items { 
    pthread_mutex_t mutex; 
    int i; 
    thread_items(pthread_mutex_t m, int i): mutex(m), i(i){} 
} 

Je suis en train de créer un tableau de cette struct et initialiser tous les mutex pendant que je suis à elle. Pour une raison quelconque, quand j'imprimer les adresses mutex je reçois tous de la mutex avec la même adresse:

vector <thread_items*> thread_items_vec; 
for (int i = 0; i < 3; i++) 
{ 
    pthread_mutex_t mutex; 
    pthread_mutex_init(&mutex, NULL); 
    thread_items * items = new thread_items(mutex, i); 
    thread_items_vec.push_back(items); 
    cout << "Mutex " << i << " is " << &mutex << endl; 
} 

Il en résulte cette impression:

Mutex 0 is 0x7fff9580b520 
Mutex 1 is 0x7fff9580b520 
Mutex 2 is 0x7fff9580b520 

La raison pour laquelle je suis arrivé à imprimer est parce que mon la simultanéité a des problèmes et j'ai remarqué que je ne suis pas en train de verrouiller le bon Mutex.

Donc ma question est: est-ce que j'initialise correctement le mutex pour avoir 3 mutex différents? Est-ce que mon impression montre vraiment un problème ici? À partir des réponses, j'imprime le pointeur de pile qui est toujours le même. Cela signifie-t-il que j'initialise mon Mutex pour la même adresse?

+0

Qu'est-ce 'thread_items_map'? –

+0

Qu'est-ce que thread_items_map? –

+0

Désolé le code est vraiment complexe, j'ai essayé d'apporter uniquement les parties pertinentes. Je vais éditer ma question – Eyzuky

Répondre

2

Vous imprimez l'adresse de la variable de la pile mutex, cela devient recréé chaque fois autour de la boucle vraisemblablement à la même adresse

+0

Donc, n'est-ce pas un problème quand je fais pthread_init_t (& mutex, NULL)? Depuis que je donne la même adresse? – Eyzuky

+3

C'est encore pire "mutex" est détruit à chaque tour de la boucle. Vous passez l'adresse à quelque chose qui n'existe plus. –

+0

Votre réponse et votre commentaire m'ont aidé à comprendre un bug avec lequel je me débattais depuis trop longtemps. Même si ma question a été votée, cela en valait vraiment la peine. Merci Monsieur. – Eyzuky