2011-02-24 9 views
5

¿Cómo puedo pasar boost :: shared_ptr como un puntero a una función de subproceso de Windows? asumir siguiente código:¿Cómo puedo pasar boost :: shared_ptr como un puntero a una función de subproceso de Windows?

test::start() 
{ 
    .... 
    _beginthreadex(NULL, 0, &test::threadRun, &shared_from_this(), 0, &threadID); 

    ... 
    ... 
} 

/*this is a static function*/ 
UINT __stdcall test::threadRun(LPVOID lpParam) 
{ 
    shared_ptr<test> k = *static_cast< shared_ptr<test>* >(lpParam); 
    ... 
} 

Creo que este código es incorrecto, ¿cuál es tu idea? ¿cómo puedo hacer esto?

EDIT: resolví mi problema por boost :: weak_ptr. verifique mi propia respuesta en este page

+2

¿por qué no usas Boost.Thread en su lugar? – jalf

+0

Tengo una gran cantidad de códigos que funcionan con el hilo de Windows, actualmente no tengo suficiente tiempo para convertirlos a boost. Thread, Además, nunca he usado boost.thread. –

+3

no necesita convertirlos a todos. Pero Boost.Thread es tipo seguro y maneja este problema de manera muy intuitiva. – jalf

Respuesta

1

he resuelto mi problema por impulso :: weak_ptr:

test::start() 
{ 
    .... 
    shared_ptr<test> shPtr = shared_from_this(); 
    boost::weak_ptr<test> wPtr=shPtr; 
    _beginthreadex(NULL, 0, &test::threadRun, &wPtr, 0, &threadID); 

    ... 
    ... 
} 

/*this is a static function*/ 
UINT __stdcall test::threadRun(LPVOID lpParam) 
{ 
shared_ptr<test> k  = static_cast< boost::weak_ptr<test>* >(lpParam)->lock(); 
    ... 
} 
+3

Esto no garantiza resolver el problema ya que wPtr es una variable local en test :: start() y se invalidará cuando test :: start() termine, por lo que el problema es el mismo que antes a menos que espere el hilo que comienza a "recoger" el parámetro antes de que comience() sale. – CashCow

1

Debe usar un reinterpret_cast y tener cuidado de tener al menos un shared_ptr durante el desove. De lo contrario, tu objeto será destruido. Es decir, dado que pasa un puntero a shared_ptr, no disfrutará de la protección habitual del puntero y si se destruyen todos sus shared_ptrs existentes, cuando se engendre el hilo contendrá un puntero ilegal.

3

Cuando tiene que pasar el parámetro de una clase a una función/método estático y lo que tiene es un parámetro de devolución de llamada (generalmente en devoluciones de llamadas de subprocesos), generalmente paso this a la devolución de llamada. De esta forma tienes un elenco simple y tienes acceso a todos los miembros de tu clase. Prácticamente, la devolución de llamada es como un miembro de su clase:

test::start() 
{ 
    // [...] 
    _beginthreadex(NULL, 0, &test::threadRun, this, 0, &threadID); 
    // [...] 
} 

// this is a static function 
UINT __stdcall test::threadRun(LPVOID lpParam) 
{ 
    test* self = static_cast<test*>(lpParam); 

    // do whatever you want with all the instance members :) 

    self->getMyShared(); 
    self->useMyGreatMemberMethof(); 

    // ... 
} 

MY2C

0

Esta es una de las situaciones en realidad donde intrusiva el recuento de referencias funciona bien.

Si desea pasar el boost::shared_ptr se puede poner en una estructura que tiene el recuento de referencias intrusivo y pasarlo en.

Esto es suponiendo que no sólo quieren pasar un puntero prima y obtener el recibir hilo para eliminarlo cuando termine.

Cuestiones relacionadas