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 回答