0

私の C++ ライブラリは、コードのどこかに pthread_create を使用してスレッドを作成します。ライブラリをスタンドアロン アプリケーション内で使用するとうまく機能しますが、PHP 拡張機能で使用する場合はうまくいきません。関数は戻りません。

void* threadloop(void * param)
{
    zend_printf("B\n");
}
PHP_FUNCTION(create_thread)
{
    pthread_t othread;
    pthread_create (&othread, NULL, threadloop, NULL);
    zend_printf("A\n");
}

「B」は印刷されません。

これどうやってするの?

ありがとう!

4

2 に答える 2

2

次のようなことを試してください:

void* threadloop(void * param)
{
  zend_printf("B\n");
}
PHP_FUNCTION(create_thread)
{
  pthread_t othread;
  auto result = pthread_create (&othread, NULL, threadloop, NULL);
  if (result != 0)
    zend_printf("Error!\n");
  zend_printf("A\n");
  void* result = nullptr;
  auto result2 = pthread_join( othread, &result );
  if (result2 != 0)
    zend_printf("Error2!\n");
}

ここで、コードを取得し、簡単なエラー処理を追加し、生成されたスレッドに参加して、スレッドが終了したことを確認しました。

上記のいくつかの C++11 機能を使用しました (auto特にnullptr)。それらがコンパイラでサポートされていない場合、それらを置き換えるのは非常に簡単なはずです (あなたの戻り値の型はpthread_create何ですか?)

于 2013-01-16T20:24:23.530 に答える
2

新しく作成されたスレッドの印刷とプロセスの終了との間に競合状態があります。プロセスの終了を許可する前にスレッドに参加するなど、何らかの同期が必要です。(使用しsleepても問題はありませんがsleep、スレッド同期の形式として使用しないでください。)

于 2013-01-16T20:22:44.070 に答える