From David Fries, "I was trying to create a lot of threads under 32 bit Linux, but could

only create 376, then the program would hang.
376 * 8MB stack per thread = 3008 MB
The stack size allocated per thread blew the process address stack.
To get more threads you have to specify a smaller per thread stack,
but while the Thread::start says it will limit the stack size to the
smallest allowable stack size, it won't let it be smaller than the
default.  I included the limits.h header to use PTHREAD_STACK_MIN as
the minimum stack size.

As for the deadlock, if the pthread_create failed, the new thread
doesn't exist and doesn't call threadStartedBlock.release(), so the
existing thread deadlocks on threadStartedBlock.block().  Only block
if the thread was started."
This commit is contained in:
Robert Osfield
2009-11-20 10:27:43 +00:00
parent 65d72d7873
commit f45ae6a4d8
2 changed files with 23 additions and 24 deletions

View File

@@ -21,6 +21,7 @@
#include <sys/types.h>
#include <unistd.h>
#include <pthread.h>
#include <limits.h>
#if defined __linux || defined __sun || defined __APPLE__
#include <string.h>
@@ -588,29 +589,28 @@ int Thread::start() {
PThreadPrivateData *pd = static_cast<PThreadPrivateData *> (_prvData);
size_t defaultStackSize;
pthread_attr_getstacksize( &thread_attr, &defaultStackSize);
if(status != 0) {
return status;
}
if(defaultStackSize < pd->stackSize) {
pthread_attr_setstacksize( &thread_attr, pd->stackSize);
if(status != 0) {
return status;
}
//-------------------------------------------------------------------------
// Set the stack size if requested, but not less than a platform reasonable
// value.
//
if(pd->stackSize) {
if(pd->stackSize < PTHREAD_STACK_MIN)
pd->stackSize = PTHREAD_STACK_MIN;
pthread_attr_setstacksize( &thread_attr, pd->stackSize);
if(status != 0) {
return status;
}
}
//-------------------------------------------------------------------------
// Now get what we actually have...
//
pthread_attr_getstacksize( &thread_attr, &defaultStackSize);
size_t size;
pthread_attr_getstacksize( &thread_attr, &size);
if(status != 0) {
return status;
}
pd->stackSize = defaultStackSize;
pd->stackSize = size;
//-------------------------------------------------------------------------
// Prohibit the stack size from being changed.
@@ -635,18 +635,15 @@ int Thread::start() {
status = pthread_create(&(pd->tid), &thread_attr,
ThreadPrivateActions::StartThread,
static_cast<void *>(this));
// wait till the thread has actually started.
pd->threadStartedBlock.block();
if(status != 0) {
return status;
if(status == 0) {
// wait till the thread has actually started.
pd->threadStartedBlock.block();
pd->idSet = true;
}
pd->idSet = true;
return 0;
return status;
}
//-----------------------------------------------------------------------------