c ++ pthread error: недопустимое использование нестатической функции-члена

У меня ошибка: неверное использование нестатической функции-члена, когда я пытаюсь скомпилировать следующий код:

int main()
{
data d;
cta ce;
pthread_t thread1;
pthread_t thread2;
pthread_create( &thread1, NULL, d.subscribe, NULL );
pthread_create( &thread2, NULL, ce.startStrategy, NULL );
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);

return 0;
}

// cta.cpp
// ...
static void* cta::startStrategy()
{
std::cout<<"haha"<<std::endl;
}

// data.cpp
// ...
static void* data::subscribe()
{
std::cout<<"haha"<<std::endl;
}

получить ошибку:

main.cpp:38:52: error: invalid use of non-static member function
pthread_create( &thread1, NULL, d.subscribe, NULL );
^
main.cpp:39:60: error: invalid use of non-static member function
pthread_create( &thread2, NULL, ce.startStrategy, NULL );

однако подобный фрагмент кода работает довольно хорошо:

#include <iostream>
#include <pthread.h>
class Foo {
public:
static void func() {
std::cout << "hi" << std::endl;
}
};

int main() {
Foo ins;
pthread_t pt;
pthread_t pt1;
pthread_create( &pt, NULL, ins.func, NULL );
pthread_create( &pt1, NULL, ins.func, NULL );
pthread_join(pt, NULL);
pthread_join(pt1, NULL);
return 0;
}

он хорошо компилируется и печатает «привет» дважды, мне интересно, что может быть не так с моим кодом, так как я уже перешел с void на static void и следую той же схеме, почему я все еще получаю нестатическую ошибку?

-1

Решение

Прежде всего, не используйте pthread, Используйте C ++ std::threadи достичь счастья.

Посмотрите это:

std::thread t1(&data::subscribe, &d);
std::thread t2(&cta::start_strategy, &ce);

Во-вторых, наиболее вероятной причиной вашей проблемы является то, что static Модификатор должен использоваться в определении класса (файл .h), а не в определении функции вне класса.

1

Другие решения

Если вы собираетесь использовать pthread_create, вы должны передать ему параметры, которые он хочет. Начальная процедура void *(*start_routine) (void *), Обратите внимание, что там нет ничего о какой-либо функции-члена, static или иным образом. Поэтому код неверен, даже если он работает на какой-то платформе.

-1

По вопросам рекламы [email protected]