0

次のようなメイン関数があります。

    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() もプロトコル クラスの関数です。私の質問は、オブジェクト 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 に答える