casting to void * para pasar objetos a pthread en c ++
Estoy un poco confundido acerca de cómo pasar un objeto a la función pthread_create. He encontrado mucha información por partes concerniente a la conversión a void *, la transmisión de argumentos a pthread_create, etc., pero nada que lo vincule todo. Solo quiero asegurarme de que lo he unido todo y no estoy haciendo nada estúpido. Digamos que tengo la siguiente clase de hilo:Editar: arreglado mal emparejadostatic_cast
.
class ProducerThread {
pthread_t thread;
pthread_attr_t thread_attr;
ProducerThread(const ProducerThread& x);
ProducerThread& operator= (const ProducerThread& x);
virtual void *thread_routine(void *arg) {
ProtectedBuffer<int> *buffer = static_cast<ProtectedBuffer<int> *> arg;
int randomdata;
while(1) {
randomdata = RandomDataGen();
buffer->push_back(randomdata);
}
pthread_exit();
}
public:
ProtectedBuffer<int> buffer;
ProducerThread() {
int err_chk;
pthread_attr_init(&thread_attr);
pthread_attr_setdetachstate(&thread_attr,PTHREAD_CREATE_DETACHED);
err_chk = pthread_create(&thread, &thread_attr, thread_routine, static_cast<void *> arg);
if (err_chk != 0) {
throw ThreadException(err_chk);
}
}
~ProducerThread() {
pthread_cancel(&thread);
pthread_attr_destroy(&thread_attr);
}
}
Para aclarar, los datos en elProtectedBuffer
Solo se puede acceder a la clase con métodos comoProtectedBuffer::push_back(int arg)
, que utilizan mutexes para proteger los datos reales.
Mi pregunta principal es: estoy usandostatic_cast
¿correctamente? Y mi pregunta secundaria es ¿Necesito esa primera línea envirtual void *thread_routine(void *arg)
donde copio el puntero nulo pasado a un puntero aProtectedBuffer
?
Además, si he hecho algo más que podría causar problemas, apreciaría escucharlo.