Что не так с моей сигнатурой метода при передаче указателя метода на pthread_create? [Дубликат]

0

В моем файле заголовка у меня есть следующее объявление под private:

void *computeSignalBlock(void *);

Теперь я не могу скомпилировать попытку передать этот метод методу pthread_create. Ошибка:

cannot convert ‘medianfilter::computeSignalBlock from
type ‘void* (medianfilter::)(void*) to type ‘void* (*)(void*)

Почему это смотрит на мои реализации ниже?

void medianfilter::computeFilteredResults(vector<float> _signals, int _nThreads,
        int _windowSize, bool _isParallel) {

    // Set instance variables.
    originalSignalVector = _signals;
    nThreads = _nThreads;
    windowSize = _windowSize;
    isParallel = _isParallel;

    // Create the threads,
    pthread_t threads[nThreads];
    pthread_attr_t attr;
    // Initialize and set thread joinable
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

    for (int i = 0; i < nThreads; i++) {
        pthread_create(&threads[i], NULL, computeSignalBlock, (void *) i);
    }

}

void *medianfilter::computeSignalBlock(void *block) {
    //TODO I need  access to instance variables!
}
Теги:

1 ответ

2
Лучший ответ

Вы не можете передавать указатели на функции функции pthread_create.

Вам нужно будет объявить соответствующую static функцию в вашем классе (вы можете передать this указатель, используя параметр void*).

class medianfilter {

    static void* computeSignalBlock(void *);
};

void *medianfilter::computeSignalBlock(void *instance) {    
    medianfilter* thisPtr = reinterpret_cast<medianfilter*>(instance);

    //TODO I need  access to instance variables!
}
  • 0
    Но используя static, я больше не мог использовать переменные экземпляра (или это отличается от Java)?
  • 1
    @feder Посмотрите, как это сделать, я обновил мой образец.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню