2013-07-24 3 views
0

я получил основную функцию, как это:объекты в Posix Thread-функций

int main(){ 
    .... 
    Protocol SPI_conn; 

    SPI_conn.omap_SPI_init(); 
    .... 
    pthread_create(&rt_OneStep0_thread, NULL, rt_OneStep0, NULL); 
    .... 
    } 

, где SPI_conn является объектом Протокола класса и omap_SPI_init() представляет собой метод того же класса. Моя функция потока выглядит так:

extern "C" void * rt_OneStep0(void *) 
{ 
while (1) { 
    sem_wait(&step0_semaphore); 
    SPI_do(); 
    sem_wait(&step0_semaphore); 
    } 
} 

SPI_do() также является функцией протокола класса. Мой вопрос в том, как я могу использовать объект SPI_conn с методом SPI_do. Обычно вы можете сделать это по ссылке, но здесь rt_OneStep0 (void *) должен быть определен следующим образом, правильно?

Я очень ценю вашу помощь!

+0

Передайте объект, созданный в главном, функции потока через void * arg для функции потока. Google для учебника pthreads - есть много примеров с примерами того, как это сделать. – mathematician1975

ответ

0

Абсолютно верно, что ваши прототипы верны. Все дело в том, как вы можете использовать последний параметр pthread_create. Это на самом деле указатель на все, что вы хотите, который будет передан как параметр в точку входа вашего потока (так, здесь, rt_OneStep0).

Таким образом, если вы создаете нить вроде этого:

pthread_create(&rt_OneStep0_thread, NULL, rt_OneStep0, &SPI_conn);

Вы получите адрес вашего SPI_conn объекта в качестве аргумента void* вашей rt_OneStep0 функции. Вам просто нужно вернуть его к соответствующему типу, и вы можете использовать его в обычном режиме.

extern "C" void * rt_OneStep0(void *arg) 
{ 
     Protocol *my_object = static_cast<Protocol*>(arg); 
     //... 
} 

Однако, так как вы имеете дело с потоками, и вы будете делить объект, созданный на основном потоке, будьте осторожны параллельности и гонки условий.

+0

, а потом я могу пойти с этим? 'my_object-> SPI_do();' – Kilian

+0

Абсолютно. После того, как вы вернетесь к соответствующему типу, вы можете использовать его в обычном режиме. – Nbr44

+0

Большое спасибо! – Kilian