6
votes

Pthread_mutex_initializer à l'intérieur de la fonction membre C ++ ne peut pas compiler?

class A {
    public:
        A();
    private:
        pthread_mutex_t mu;
};

A::A()
{
    mu = PTHREAD_MUTEX_INITIALIZER;  //cannot compile
}
Can't I initialize pthread_mutex_t inside a class member function?

1 commentaires

Ce que vous montrez, c'est une affectation et non une initialisation.


4 Réponses :


8
votes

Utilisez pthread_mutex_init Dans ce cas, comme la constante est Pour l'initialisation du temps de compilation.


2 commentaires

Ensuite, je ne peux pas mettre pthread_mutex_t membre de données dans la liste d'initialisation, puis-je?


Désolé, je voulais dire une initialisation du temps compilé, pas une initialisation statique. Et oui, vous ne pouvez pas le mettre (au moins sinon pas en C ++ 11) dans les listes d'initialisation.



11
votes

au lieu de ceci: xxx pré>

Essayez ceci: p>

A::A()
{
pthread_mutex_init( &(mu), NULL);
}


0 commentaires

2
votes

Même si nous modifions ceci pour utiliser une liste d'initialiseurs dans le constructeur, il échoue toujours:

A::A()
{
    const pthread_mutex_t test = PTHREAD_MUTEX_INITIALIZER; //  initialization - fine
    mu = test; // assignment - fine
    mu = PTHREAD_MUTEX_INITIALIZER;  // assignment - C++11 only
}


2 commentaires

Le code d'origine est légal C ++ 11 également, vous n'avez probablement pas la prise en charge C ++ 11 activée dans votre compilateur.


@Alcott Il n'y a que 3 versions majeures de la norme - Ne mélangez pas les versions du compilateur d'un fournisseur spécifique avec des versions standard.



0
votes

J'aime les réponses de @askmish & @diego. J'aime aussi ce que @flexo a expliqué.

mais simplement comme une option, si vous souhaitez l'initialisation avec le pthread_mutex_initializer macro, ce que vous pouvez faire est de faire la déclaration mutex à l'intérieur de la définition de la classe < Code> statique comme ceci: xxx

et vous pouvez ensuite initialiser ce mutex statique dans votre fichier source, mais en dehors de toute fonction membre, comme celui-ci: xxx

vos options:

  • Donc, vous gardez la macro et allez statique (comme indiqué ici). Ou,
  • Vous conservez la déclaration du mutex le même (non statique) mais utilisez la fonction pthread_mutex_init () (comme d'autres ont indiqué) à l'intérieur de votre fonction de membre.

0 commentaires