0

我有一个这样的主要功能:

    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*) 必须像这样定义,对吧?

我真的很感谢你的帮助!

4

1 回答 1

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);   
      //... 
}

但是,由于您正在处理线程并且您将共享在主线程上创建的对象,因此请注意并发和竞争条件。

于 2013-07-24T08:15:03.223 回答