2013-08-16 1 views
-2

я получил, что:Как передать функцию-член как pthread start_routine?

void* xxx::yyy(void* ThreadIdPtr) 

И теперь я, что:

pthread_create(&tp, NULL, xxx::yyy, (void*) &i); 

но компиляции ошибка:

error: argument of type 'void* (xxx::)(void*)' does not match 
'void* (*)(void*)' 

Как передать это правильно?

+3

Я предлагаю вам прочитать о [ 'станд :: thread'] (http://en.cppreference.com/w/ CPP/резьба/резьба). –

+2

Что касается вашего вопроса, то простой ответ заключается в том, что вы * cant't * используете нестационарную функцию-член. Все нестатические функции-члены имеют неявный и скрытый аргумент «нуль», который является указателем 'this'. Функция C, такая как 'pthread_create', не знает об этом и поэтому не может ее передать. –

ответ

3

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

Хотя это, вероятно, не технически определенное поведение, существует хотя бы разумный шанс, что вы можете использовать указатель на функцию-член static. Затем вы можете передать указатель на объект в качестве параметра, и он может вызвать правильную функцию-член этого объекта.

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

+0

Указатель на функцию 'static' member будет работать просто отлично и отлично действует, и его использование в таком контексте определяется поведением. –

0

Если вы хотите передать функции члена к функции, которая принимает функтор, вы должны сделать это таким образом:

MyClass a; 
some_function(&MyClass::MyMethod, a); 

Каждая функция в STDLIB, которая принимает указатель на функцию имеет перегрузку принять функцию члена. Если вы хотите, чтобы передать его в станд :: нить COTR, ​​сделать это таким образом:

std::thread(&MyClass::MyMethod, a, arg1, arg2); 
Смежные вопросы