我有一个这样的主要功能:
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 *)必须这样定义,对吗?
我真的很感谢你的帮助!
答案 0 :(得分: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);
//...
}
但是,由于您正在处理线程,并且您将共享在主线程上创建的对象,因此请注意并发性和竞争条件。