2013-07-24 63 views
0

我有一個主要的功能是這樣的:對象在POSIX線程功能

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_do使用對象SPI_conn。通常你可以通過引用來完成,但是這裏必須像這樣定義rt_OneStep0(void *),對吧?

我真的很感謝你的幫助!

+0

將您在main中創建的對象通過void * arg傳遞給線程函數。谷歌爲pthreads教程 - 有很多在那裏與如何做到這一點的例子。 – mathematician1975

回答

0

絕對的,你的原型是正確的。 這一切都在於如何使用pthread_create的最後一個參數。它實際上是一個指向你想要的任何東西的指針,它將作爲參數傳遞給你的線程的入口點(所以,在這裏,rt_OneStep0)。

因此,如果您創建的線程是這樣的:

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

,您將收到SPI_conn對象的地址作爲rt_OneStep0功能的void*說法。你只需要將其轉換回適當的類型,然後就可以正常使用它。

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

不過,既然你要處理的線程,你將分享在你的主線程創建的對象,必須注意併發性和競爭條件。

+0

然後我可以去? 'my_object-> SPI_do();' – Kilian

+0

絕對。一旦你把你的論點轉換回適當的類型,你可以正常使用它。 – Nbr44

+0

非常感謝! – Kilian