Допустим, я хочу создать простой пул потоков как таковой:
#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;
};
Однако после прочтения this из cppreference
о std::thread::hardware_concurrency()
говорится, что это следует использовать только как подсказку и что, если оно не определено должным образом, оно может вернуть 0
.
Есть ли другой или более безопасный способ заставить что-то подобное работать? Основная цель - определить количество cores
во время компиляции.
-Edit-
Изначально я спрашивал об этом, потому что пытался использовать thread
внутри std::array
из-за меньших накладных расходов. В комментариях многие заявили, что, вероятно, лучше определить это во время выполнения; хорошо, так что нет проблем. Таким образом, у меня остаются другие варианты, такие как vector
, list
и т. Д., Но если я пытаюсь остаться с меньшими накладными расходами, я теперь задаюсь вопросом, будет ли queue
или dequeue
лучше подойти.
Однако, это все еще не ответило на мой главный вопрос о std::thread::hardware_concurrency()
. Есть ли другая функция или метод, который на самом деле будет возвращать количество ядер на текущем компьютере, а не просто подсказку?