1

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

辅助线程是使用该PTHREAD_CREATE_DETACHED属性创建的,因此我可以避免加入它们。

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

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

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;
}

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

<incoming event>

Class1 update()
[New thread 1]
Class1 thread created=0

Class2 update()
Class2 thread created=11 (EAGAIN)

Class1 init()
[Thread 1 exited]

<incoming event>

Class1 update()
[New thread 2]
Class1 thread created=0

Class2 update()
Class2 thread created=11 (EAGAIN)

Class1 init()
[Thread 2 exited]

(...and so it goes on)

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

4

2 回答 2

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);
}
于 2012-06-26T15:03:51.970 回答
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);
}

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

于 2012-06-26T11:16:55.117 回答