2012-07-26 12 views

risposta

7

Utilizzare pthread_mutex_init in questo caso, poiché la costante è per l'inizializzazione in fase di compilazione.

+0

Solo per 'static pthread_mutex_t'? – Alcott

+0

Quindi non posso mettere il membro dei dati 'pthread_mutex_t' nella lista di inizializzazione, posso? – Alcott

+0

Scusa, intendevo l'inizializzazione in fase di compilazione, non l'inizializzazione statica. E sì, non puoi metterlo (almeno se non in C++ 11) negli elenchi di inizializzazione. –

10

Invece di questo:

A::A() 
{ 
    mu = PTHREAD_MUTEX_INITIALIZER; //cannot compile 
} 

Prova questo:

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

Il PTHREAD_MUTEX_INITIALIZER è una macro, un inizializzatore C struct per qualcosa come {0,0,0,0,0 {0 }} e può essere utilizzato solo al punto di definizione.

2

Anche se cambiamo questa opzione per utilizzare un lista di inizializzazione nel costruttore non riesce ancora:

#include <pthread.h> 

struct foo { 
    pthread_mutex_t test; 
    foo() : test(PTHREAD_MUTEX_INITIALIZER) {} 
}; 

int main() { 
    foo f; 
} 

possiamo vedere perché non riesce e un essere utilizzato solo per l'inizializzazione in pochi contesti, cercando in l'uscita dal pre-processsor:

struct foo { 
    pthread_mutex_t test; 
    foo() : test({ { 0, 0, 0, 0, 0, { 0 } } }) {} 
}; 

non è legale per utilizzare le parentesi annidate per l'inizializzazione del genere in C++ 03, ma ciò che è più interessante forse è che C++ 11 rende questa sintassi e l'uso perfettamente legale .

Nel codice originale si può vedere un paio di cose:

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

Allora perché il mio codice nell'OP non può essere compilato? – Alcott

+0

Anche il codice originale è legale C++ 11, probabilmente non hai il supporto per C++ 11 abilitato nel tuo compilatore. – Flexo

+0

Ci sono così tanti std di C++, mi sento un po 'confuso. – Alcott

Problemi correlati