Адрес функции-члена класса - PullRequest
0 голосов
/ 27 сентября 2011

У меня есть класс с именем CSum, который содержит статический метод, идентификатор которого:

 static double fileProc(string myFile);

В моей основной функции я бы просто назвал ее

 CSum::fileproc("foo.txt")

Однако я хотел бы вызвать pthreads для двух отдельных файлов. Поэтому мне нужно получить адрес этого метода. Я делаю это

 return1 = pthread_create(&t1, NULL, &CSum::fileProc(file1), NULL);
 return2 = pthread_create(&t2, NULL, &CSum::fileProc(file2), NULL);

Но я получаю ошибку

Значение l требуется в качестве одинарного операнда '&'.

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 27 сентября 2011

Вы не передаете параметры, вы просто даете название функции.Параметр, который вы хотите получить, является следующим параметром pthread_create.

Вместо

pthread_create(&t2, NULL, &CSum::fileProc(file2), NULL);

do

pthread_create(&t2, NULL, &CSum::fileProc, file2);

Типы приведения в зависимости от ситуации.Обратите внимание, что функция потока должна принимать указатель в качестве параметра, убедитесь, что вы правильно его определили.

0 голосов
/ 27 сентября 2011

CSum::fileProc(file1) - это выражение, которое вызывает функцию и дает вам значение, которое функция возвращает в качестве значения выражения.Вы пытаетесь получить адрес этого значения, что вы не можете, и это не будет делать то, что вы хотите.

&CSum::fileProc даст вам указатель на функцию, но он не имеет правильногоподпись для использования с pthreads.Поскольку pthreads - это библиотека C, она имеет очень упрощенный интерфейс.Лучше всего для C ++ использовать библиотеку C ++ более высокого уровня, которая использует pthreads (по крайней мере, для Unix), например, потоки Boost.

Если по какой-то причине вы не можете этого сделать, вам нужно написатьваши собственные обертки.Чтобы вызвать вашу функцию в отдельном потоке, вам нужно написать что-то вроде:

class CSum {
...
    static void fileProcWrapper(void* param) {
        const char* fileName = (const char*) param;
        fileProc(fileName);
    }
...

и вызвать ее с помощью

pthread_create((&t2, NULL, &CSum::fileProc, (void*) file1.c_str());

Это просто даст вам вызов, ум, результатвыбрасывается с этим кодом.Если вы хотите получить результат с помощью pthread_join, вам нужно проделать еще немного работы.

...