我有许多类在我的程序中注册通知类。在特定的传入事件上,通知程序在每个类中调用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>
答案 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);
}
如果有人经历过类似的事情,或者可以对此有所了解,我仍然感兴趣。