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

标签 c++ winapi

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

相关文章:

c++ - 在 C++ 中检查地址的可变值

c++ - 为什么 QML 会删除我的 C++ ListView 模型?

c# - 如何在调用方法中定义回调函数?

C++ Windows : LRESULT CALLBACK and WNDPROC

c++ - 根据世界位置在一维数组中查找通用项目?

c++ - 正确使用 d3d9 的后台缓冲功能

c++ - 你能给我一个 16 位(或更多)十进制数,它只在第 15 位正确转换为 double float 吗?

c++ - WTL CIdleHandler 的正确用法是什么?

C++ 系统时间返回相同的错误值

c++ - 如何将格式字符串打印到窗口中?