gpt4 book ai didi

c++ - 在C++中使用Threadpool创建线程时如何指定堆栈大小

转载 作者:行者123 更新时间:2023-12-02 10:02:41 29 4
gpt4 key购买 nike

我正在一个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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com