У меня есть приложение, которое использует 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);
}