2010-03-17 27 views
25

Tengo una clase que puedo tener muchas instancias de. Dentro crea e inicializa algunos miembros de una biblioteca de terceros (que usan algunas variables globales) y no es seguro para subprocesos.Usar mutex estático en una clase

Pensé en usar static boost :: mutex, que estaría bloqueado en mi clase de constructor y destructor. Por lo tanto, crear y destruir instancias entre mis hilos sería seguro para los miembros de terceros.



class MyClass 

{ 
    static boost::mutex mx; 

    // 3rd party library members 
public: 
    MyClass(); 
    ~MyClass(); 
}; 

MyClass::MyClass() 
{ 
    boost::mutex::scoped_lock scoped_lock(mx); 
    // create and init 3rd party library stuff 
} 

MyClass::~MyClass() 
{ 
    boost::mutex::scoped_lock scoped_lock(mx); 
    // destroy 3rd party library stuff 
} 
 

No puedo vincular porque recibo de error:

undefined reference to `MyClass::mx` 
  1. ¿Necesito alguna inicialización específica de dicho miembro estático?

  2. ¿Hay algún problema con el uso del mutex estático?


Editar: Vinculación problema se resuelve con la definición correcta de la PPC

boost::mutex MyClass::mx; 
+1

Si usa un mutex estático, serializará el uso de * todas * las instancias de su clase, anulando por completo cualquier beneficio que pueda obtener a través de subprocesamiento múltiple. ¿Estás seguro de que quieres esto? –

+0

@John Dibling Sí, solo se protegerá la creación y destrucción de los objetos; no ocurrirá con demasiada frecuencia. El resto del tiempo las instancias se usarán sin bloquear el mutex y debería ser bastante eficiente. –

+0

@Dmity: Lo que me lleva a mi siguiente pregunta: ¿está seguro de que será seguro usar las instancias sin bloqueo? –

Respuesta

37

Usted ha declarado, pero no se define el mutex estática clase. Simplemente agregue la línea

boost::mutex MyClass::mx; 

al archivo cpp con la implementación de MyClass.

+0

10x, solucionó el problema de vinculación. Intenté definirlo antes pero me perdí el tipo antes de MyClass :: mx –

Cuestiones relacionadas