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

问题描述 投票:1回答:1

我正在做一个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;
    }
};
c++ winapi
1个回答
2
投票

QueueUserWorkItem() 是一个传统的API。 它没有提供设置线程池中线程的堆栈大小的方法。

QueueUserWorkItem() 在Windows Vista中已被废弃,被一个 新的线程池API 提供更多的控制。 直接替换 QueueUserWorkItem() 在这个API中是 SubmitThreadpoolWork(). 它的工作项目是以 CreateThreadpoolWork(),它允许用户提供一个可选的 TP_CALLBACK_ENVIRON 结构传递给它,以控制工作项运行的环境。

您可以使用以下方法创建一个新的线程池 CreateThreadpool()的堆栈大小,然后使用 SetThreadpoolStackInformation(),然后创建一个 TP_CALLBACK_ENVIRON 并将其与这个池子联系起来,使用 SetThreadpoolCallbackPool()然后最终通过 TP_CALLBACK_ENVIRONCreateThreadpoolWork().

© www.soinside.com 2019 - 2024. All rights reserved.