2017-01-15 7 views
0

Я пытаюсь вызвать функцию-член pthread с помощью внешней обертки, но это не работает для меня, я получаю ошибку seg. Почему это? Вот небольшая тестовая программа, которая отображает проблему:pthread, чтобы вызвать элемент func, обернув его извне

#include <iostream> 
#include <pthread.h> 
class test {  
    public: 
     test(); 
     ~test(); 
     void RunTh(void); 
    private: 
     pthread_t *pid; 
}; 
void *Run_wrp(void *context); 
void test::RunTh(void) 
{ 
    while(1); 
} 
test::test() 
{ 
    pthread_create(pid,NULL,&Run_wrp,this); 
} 
test::~test(){} 

int main(void) { 
    test tmp; 
    std::cin.get(); 
} 

void *Run_wrp(void *context) 
{ 
    ((test*)context)->RunTh(); 
} 
+1

«pid» - это просто указатель, но не фактический объект «pthread_t» - попробуйте удалить «*», а затем просто разыграем его «&» в вашем вызове «pthread_create()». – sonicwave

+1

Кроме того, если вы сделаете «Run_wrp» статической функцией-членом вашего класса, вы можете сохранить все в ней, вместо того, чтобы полагаться на внешние помощники. – sonicwave

+1

@sonicwave Если вы переместите свой первый комментарий в ответ, я приму его! – cerr

ответ

1

Вашего pid переменной член только указатель, а не фактический pthread_t объекта.

Изменить это:

private: 
    pthread_t pid; 

Затем создайте новый поток с:

pthread_create(&pid,NULL,&Run_wrp,this); 

Кроме того, если вы хотите сохранить все, содержащиеся в классе, вы можете сделать свой Run_wrp() функцию а static член функции test, если вы сохраняете одну и ту же подпись (возвращаемое значение/аргументы). Он должен быть static, так как функции не static принимают указатель this на класс в качестве скрытого аргумента, и, таким образом, заканчиваются другой подписью, чем то, что вам нужно для pthread_create().