Определение количества процессоров для текущей машины - PullRequest
0 голосов
/ 22 января 2019

Допустим, я хочу создать простой пул потоков как таковой:

#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(). Есть ли другая функция или метод, который на самом деле будет возвращать количество ядер на текущем компьютере, а не просто подсказку?

...