我有许多类在我的程序中注册了通知类。在特定的传入事件上,通知程序调用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 仍然失败,促使我认为类之间存在细微差别。但是,两个类中显示的代码是相同的,所以如果有人知道其他变量/函数/等可能会产生影响,或者可能会发生什么,我会很高兴听到它。