rzucanie do void * w celu przekazania obiektów do pthread w c ++
Jestem trochę zdezorientowany, jak przekazać obiekt do funkcji pthread_create. Znalazłem wiele fragmentarycznych informacji dotyczących rzucania do void *, przekazywania argumentów do pthread_create itp., Ale nic, co łączy to wszystko razem. Chcę tylko upewnić się, że mam wszystko powiązane i nie robię nic głupiego. Powiedzmy, że mam następującą klasę wątków:Edytować: naprawiono błędnie dopasowanestatic_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);
}
}
Aby wyjaśnić, dane wProtectedBuffer
do klasy można uzyskać dostęp tylko za pomocą takich metodProtectedBuffer::push_back(int arg)
, które używają muteksów do ochrony rzeczywistych danych.
Moje główne pytanie brzmi: czy używamstatic_cast
poprawnie? Moje drugie pytanie brzmi: czy potrzebuję tej pierwszej liniivirtual void *thread_routine(void *arg)
gdzie kopiuję przekazany nieważny wskaźnik do wskaźnika naProtectedBuffer
?
Ponadto, jeśli zrobiłem coś innego, co mogłoby powodować problemy, z przyjemnością to usłyszę.