posix线程函数中的对象

objects in posix thread-functions

本文关键字:对象 函数 线程 posix      更新时间:2023-10-16

我有一个像这样的主要函数:

    int main(){
    ....
    Protocol SPI_conn;
    SPI_conn.omap_SPI_init();
    ....
    pthread_create(&rt_OneStep0_thread, NULL, rt_OneStep0, NULL);
    ....
    }

其中SPI_conn是类Protocol的对象,omap_SPI_init()是同一类的方法。我的线程函数如下:

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

SPI_do()也是Protocol类的一个函数。我的问题是,如何将对象SPI_conn与方法SPI_do一起使用。通常你可以通过引用来完成,但这里rt_OneStep0(void*)必须这样定义,对吧?

我真的很感谢你的帮助!

当然,您的原型是正确的。这一切都取决于如何使用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);   
      //... 
}

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