pthread_create使用EAGAIN失败 - 但仅限于某个函数

时间:2012-06-26 10:31:44

标签: c++ pthreads

我有许多类在我的程序中注册通知类。在特定的传入事件上,通知程序在每个类中调用update()函数。在其中两个被调用者中,我现在正在尝试生成一个小的辅助线程,它将等待几秒钟,然后初始化一些外部硬件并返回。

使用PTHREAD_CREATE_DETACHED属性创建帮助程序线程,因此我可以避免加入它们。

这适用于其中一个线程(从class1生成),但pthread_create()在另一个(来自class2)中失败并带有EAGAIN。根据{{​​1}}文档,如果应用程序资源不足,就会发生这种情况。但是,如果我提供另一个传入事件,则线程1可以再次创建其辅助线程 - 而线程2仍然以相同的错误失败 - 我可以继续这样做同样的结果。

我正在使用的代码在两个类中都是相同的:

pthread_create()

在gdb中,我得到以下输出:

class class1_2 {
  public:
    void update();
  private:
    static void *init(void *self);
    pthread_t initThread;
    pthread_attr_t initThreadAttr;
}

void class1_2::update()
{
  printf("Class%d update()\n", classNumber);
  pthread_attr_setdetachstate(&initThreadAttr, PTHREAD_CREATE_DETACHED);
  int retval = pthread_create(&initThread, &initThreadAttr, init, this);
  printf("Class%d thread created = %d\n", classNumber, retval);
}

void *class1_2::init(void *self)
{
  printf("Class%d init()\n", self->classNumber);
  //wait 3 seconds, then do stuff (~1 additional second)
  return;
}

我已经尝试在class1中评论出线程创建(有效) - 但是class2仍然失败,这促使我认为这些类之间存在细微差别。所显示的代码在两个类中都是相同的,所以如果有人知道其他变量/函数/等可能会产生什么影响,或者其他什么可能会发生,我会很高兴听到它。 / p>

2 个答案:

答案 0 :(得分:1)

对于代表妓女的目的,我会在适当的情况下将答案推荐给答案;)

确保在调用pthread_attr_init之前调用pthread_attr_setdetachstate初始化属性对象,并且不要忘记再次销毁该属性:

 void class1_2::update()
{
  printf("Class%d update()\n", classNumber);
  pthread_attr_init(&initThreadAttr);
  pthread_attr_setdetachstate(&initThreadAttr, PTHREAD_CREATE_DETACHED);
  int retval = pthread_create(&initThread, &initThreadAttr, init, this);
  printf("Class%d thread created = %d\n", classNumber, retval);
  pthread_attr_destroy(&initThreadAttr);
}

答案 1 :(得分:0)

经过一些修修补补后,我开始工作了。我没有创建处于分离状态的线程,而是在创建pthread_detach()之后将它们分离。

所以,我的update()已更改为:

void class1_2::update()
{
  printf("Class%d update()\n", classNumber);
  int retval = pthread_create(&initThread, &initThreadAttr, init, this);
  printf("Class%d thread created = %d\n", classNumber, retval);
  retval = pthread_detach(initThread);
  printf("Class%d thread detached = %d\n", classNumber, retval);
}

如果有人经历过类似的事情,或者可以对此有所了解,我仍然感兴趣。