我正在做一个C++项目,在这个项目中,我试图使用下面的类创建数百个线程。如果只有几个线程,一切都很正常。但是如果我尝试创建1000个线程,只能创建大约500个(不超过600个)线程。在这种情况下,我想改变每个线程的默认堆栈大小。
那么,怎样才能改变堆栈大小呢?
class CThreadPool
{
static const int MAX_THREADS = 10000;
public:
template <typename T>
static void QueueUserWorkItem(void (T::*function)(void),
T *object, ULONG flags = WT_EXECUTELONGFUNCTION)
{
typedef std::pair<void (T::*)(), T *> CallbackType;
std::auto_ptr<CallbackType> p(new CallbackType(function, object));
WT_SET_MAX_THREADPOOL_THREADS(flags, MAX_THREADS);
if (::QueueUserWorkItem(ThreadProc<T>, p.get(), flags))
{
// The ThreadProc now has the responsibility of deleting the pair.
p.release();
}
else
{
throw GetLastError();
}
}
private:
template <typename T>
static DWORD WINAPI ThreadProc(PVOID context)
{
typedef std::pair<void (T::*)(), T *> CallbackType;
std::auto_ptr<CallbackType> p(static_cast<CallbackType *>(context));
(p->second->*p->first)();
return 0;
}
};
QueueUserWorkItem()
是一个传统的API。 它没有提供设置线程池中线程的堆栈大小的方法。
QueueUserWorkItem()
在Windows Vista中已被废弃,被一个 新的线程池API 提供更多的控制。 直接替换 QueueUserWorkItem()
在这个API中是 SubmitThreadpoolWork()
. 它的工作项目是以 CreateThreadpoolWork()
,它允许用户提供一个可选的 TP_CALLBACK_ENVIRON
结构传递给它,以控制工作项运行的环境。
您可以使用以下方法创建一个新的线程池 CreateThreadpool()
的堆栈大小,然后使用 SetThreadpoolStackInformation()
,然后创建一个 TP_CALLBACK_ENVIRON
并将其与这个池子联系起来,使用 SetThreadpoolCallbackPool()
然后最终通过 TP_CALLBACK_ENVIRON
到 CreateThreadpoolWork()
.