2012-07-26 21 views

Respuesta

7

Uso pthread_mutex_init en este caso, como la constante es para la inicialización en tiempo de compilación.

+0

Sólo para 'pthread_mutex_t' estática? – Alcott

+0

entonces no puedo poner 'pthread_mutex_t' miembro de datos en la lista initializtion, ¿verdad? – Alcott

+0

Lo sentimos, me refería a la inicialización en tiempo de compilación, no la inicialización estática. Y sí, tampoco puedes ponerlo (al menos si no en C++ 11) en las listas de inicialización. –

10

lugar de esto:

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

Prueba esto:

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

El PTHREAD_MUTEX_INITIALIZER es una macro, un inicializador C struct para algo como {{0 0,0,0,0,0 }} y solo puede usarse en el punto de definición.

2

Incluso si cambiamos esto para usar una lista de inicialización en el constructor sigue fallando:

#include <pthread.h> 

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

int main() { 
    foo f; 
} 

podemos ver qué que falla y hay un sólo puede ser utilizado para la inicialización dentro de unos contextos examinado la salida del pre-processsor:

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

no es legal el uso de llaves anidadas para la inicialización al igual que en C++ 03, pero lo que es más interesante quizá es que C++ 11 hace que esta sintaxis y el uso perfectamente legal .

En su código original, podemos ver algunas cosas más:

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

¿Entonces por qué mi código en el OP no puede compilar? – Alcott

+0

El código original es legal C++ 11 también, probablemente usted no tiene el apoyo de C++ 11 habilitado en su compilador. – Flexo

+0

Hay tantas C++ enfermedades de transmisión sexual, me siento un poco confundido. – Alcott

Cuestiones relacionadas