gpt4 book ai didi

c++ - ENOMEM 创建线程失败的原因?

转载 作者:搜寻专家 更新时间:2023-10-31 00:04:14 26 4
gpt4 key购买 nike

我有一个应用程序,它在主线程中使用 pthread_create()pthread_detach(),然后在子线程中使用 pthread_exit()线程。

在大约 54 个 pthread_create() 调用之后,每个调用都与后续的 pthread_detach() 配对,然后是 pthread_exit() pthread_create() 失败。这是 ENOMEM 失败“内存不足”。

什么可能导致 pthread_exit() 无法释放旧线程的内存并导致我的应用程序泄漏内存并最终耗尽?

这是在 Linux Centos 5 64 位上运行,但构建的是 32 位应用程序。

下面是创建线程的代码,它调用了 pthread_create()pthread_detach()

int
_createThread()
{
pthread_attr_t attr;
int return_val;

return_val = setupMutex(_Mtx());

if (return_val != 0) {
return return_val;
}

return_val = setupCond(_StartCond());

if (return_val != 0) {
return return_val;
}

return_val = setupCond(_EndCond());

if (return_val != 0) {
return return_val;
}

return_val = pthread_attr_init(&attr);

if (return_val != 0) {
return -1;
}

size_t stackSize = 1024 * 1024 * 64; // Our default stack size 64MB.

return_val = pthread_attr_setstacksize(&attr, stackSize);

if (return_val != 0) {
return -1;
}

int tries = 0;

retry:
// _initialize() gets called by the thread once it is created.
return_val = pthread_create(&_threadId, &attr,
(void *(*)(void *))_initialize,
(void *)this);

if (return_val != 0) {
if (return_val == EAGAIN) {
if (++tries < 10) {
Exit::deferredWarning(Exit::eagainThread);
goto retry;
}
}
return -1;
}

return_val = pthread_attr_destroy(&attr);

if (return_val != 0) {
return -1;
}

return_val = pthread_detach(_threadId);

if (return_val != 0) {
return -1;
}

// Wait for the new thread to finish starting up.
return_val = waitOnCond(_Mtx(), _EndCond(), &_endCount, 10 /* timeout */, 0,
"_createThread-end");

if (return_val != 0) {
return -1;
}

return 0;
}

void
_exitThread()
{
(void) releaseCond(_Mtx(), _EndCond(), &_endCount, "_exitThread-end");
pthread_exit(NULL);
}

最佳答案

pthread_exit 之前调用 pthread_join 以便线程可以在退出前进行清理。

关于c++ - ENOMEM 创建线程失败的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4530787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com