我正在一个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中已被弃用,取而代之的是提供更多控制权的new Thread Pool API。在此API中直接替换QueueUserWorkItem()
是 SubmitThreadpoolWork()
。其工作项是使用 CreateThreadpoolWork()
创建的,它允许将用户提供的可选TP_CALLBACK_ENVIRON
结构传递给它,以控制工作项在其中运行的环境。
您可以使用 CreateThreadpool()
创建一个新的线程池,然后使用 SetThreadpoolStackInformation()
设置该池的线程的堆栈大小,然后创建一个TP_CALLBACK_ENVIRON
并使用 SetThreadpoolCallbackPool()
将其与该池关联,然后最后将该TP_CALLBACK_ENVIRON
传递给CreateThreadpoolWork()
。
关于c++ - 在C++中使用Threadpool创建线程时如何指定堆栈大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61812814/