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:
@@ -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;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user