приведение к void * для передачи объектов в pthread в c ++

Я немного озадачен тем, как передать объект в функцию pthread_create. Я нашел много частичной информации, касающейся преобразования в void *, передачи аргументов в pthread_create и т. Д., Но ничего такого, что связывало бы все это вместе. Я просто хочу убедиться, что я все это связал и не делаю глупостей. Допустим, у меня есть следующий класс потока: Edit: исправлено несоответствиеstatic_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);
    }
}

Чтобы уточнить, данные вProtectedBuffer класс может быть доступен только с помощью таких методов, какProtectedBuffer::push_back(int arg), которые используют мьютексы для защиты фактических данных.

Мой главный вопрос: я используюstatic_cast правильно? И мой второй вопрос: нужна ли мне эта первая строка вvirtual void *thread_routine(void *arg) где я копирую переданный пустой указатель на указатель наProtectedBuffer?

Кроме того, если я сделал что-то еще, что могло бы вызвать проблемы, я был бы рад услышать это.

Ответы на вопрос(2)

Ваш ответ на вопрос