2016-04-21 2 views
0

У меня есть следующая инкапсуляция для моих pthread_t нитей:Инкапсуляция Темы создает проблемы

#include <pthread.h> 

class Thread 
{ 
public: 
    void   run(const int); 
    static void *run_helper(void *); 
    bool   startThread(int); 
    void   joinThread(); 

    pthread_t  th;  
}; 

Где run это моя рутина нити, и run_helper является следующее:

void  *Thread::run_helper(int num) 
{ 
    return (Thread *)this->run(num); 
} 

Я начинаю мои темы, как например :

bool Thread::startThread(intptr_t arg) 
{ 
    return (pthread_create(&this->th, NULL, &run_helper(arg), (void *)(intptr_t)arg)); 
} 

Но когда я компиляции, я получаю следующие ошибки:

error: lvalue required as unary ‘&’ operand return (pthread_create(&this->th, NULL, &run_helper(arg), (void *)(intptr_t)arg));

error: ‘this’ is unavailable for static member functions return (Thread *)this->run(num);

И несмотря на попытки, я не могу показаться, чтобы сделать эту работу инкапсуляции.

ответ

0

Для первой ошибки вам необходимо передать третий аргумент в (void*(*)(void*)) и удалить & (возможно, литье не обязательно).

pthread_create(&this->th, NULL, (void*(*)(void*))run_helper(arg), (void *)(intptr_t)arg); 

Вторая ошибка, вы пытаетесь использовать указатель на this в статической функции, но функция не вызывается на любом объекте, поэтому вы не можете использовать this в функции, как это. Решение состоит в том, чтобы бросить arg в Thread*, а затем вызвать нестационарную функцию run.

+0

Первая ошибка в сторону. Не могли бы вы проиллюстрировать второе решение? –

+0

'((Thread *) arg) -> run()', но я не знаю, как включить аргумент в 'intptr_t', вы можете придерживаться' void * ' – mausik

1

Я думаю, что ваша проблема может быть конкретно &this->th. & имеет более высокий приоритет, чем ->. Возможно, попробуйте &(this->th).

Смежные вопросы