PHP扩展(在C ++中)函数中的pthread_create永远不会返回

时间:2013-01-16 20:07:55

标签: php c++ linux multithreading

我的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”。

我该怎么做?

谢谢!

2 个答案:

答案 0 :(得分:2)

新创建的线程打印和进程终止之间存在竞争条件。您需要某种同步,例如在允许进程终止之前加入线程。 (使用sleep可以证明问题,但绝不使用sleep作为线程同步的形式。)

答案 1 :(得分: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特性(特别是autonullptr),如果编译器不支持它们,那么替换它们应该很容易(返回什么)您pthread_create的价值类型?)