假设我要这样创建一个简单的线程池:
#include <thread>
#include <array>
template<std::uint32_t TCount>
class ThreadPool {
public:
std::array<std::thread, TCount> threads;
};
上面的内容很简单,不关心线程池的任何“实现细节”。但是,假设我想默认将模板参数设置为该代码将在其上运行的计算机的可用内核数量。
我可能会这样使用带有constexpr
函数的结构:
struct CoreCount {
static const std::uint32_t count;
constexpr std::uint32_t coreCount() {
return count;
}
const std::uint32_t operator()() {
return coreCount();
}
};
const std::uint32_t CoreCount::count = std::thread::hardware_concurrency();
然后使用上面的constexpr
仿函数和初始模板参数,如下所示:
template<uint32_t TCount = CoreCount()()>
class ThreadPool {
public:
std::array<std::thread, TCount> threads;
};
但是,从cppreference
读到std::thread::hardware_concurrency()
的{{3}}后,它指出这仅用作提示,如果定义不正确,它可以返回{{1 }}。
是否有另一种或更安全的方法来使类似的东西起作用?主要目标是能够在编译时确定0
的数量。
-编辑-
我最初问这个问题是因为由于开销较小,我试图在cores
内使用thread
。许多人在评论中说,最好在运行时确定这一点。好吧,没问题。这样就给了我其他选择,例如std::array
,vector
等,但是如果我想保持较低的开销,我现在想知道list
或queue
是否会更合适。
但是,这仍然没有回答我关于dequeue
的主要问题。有没有另一个函数或方法可以实际返回当前计算机上的内核数量,而不仅仅是提示?