Почему количество созданных потоков меньше, чем thread-max? - PullRequest
4 голосов
/ 25 марта 2020

С этим кодом:

void yield_sleep(void)
{
    using namespace std::chrono;

    static size_t thread_num;

    auto start{high_resolution_clock::now()};
    std::this_thread::yield();
    auto end{high_resolution_clock::now()};

    std::cout << thread_num++
              << "|Waiting for: "
              << duration_cast<microseconds>(end - start).count()
              << " ms."
              << std::endl;
}

int main(void)
{
    std::vector<std::thread> tp(62434);

    std::generate(tp.begin(), tp.end(), []() { return std::thread(yield_sleep); });
    std::for_each(tp.begin(), tp.end(), [](auto& t) { t.join(); });
}

Программа создает поток ~ 32718 и выдает исключение:

terminate called after throwing an instance of 'std::system_error'
  what():  Resource temporarily unavailable

Но в /proc/sys/kernel/threads-max значение равно 62434. В чем проблема ? почему моя программа выдает исключение при создании потоков?

1 Ответ

1 голос
/ 26 марта 2020

Как упомянуто @ 1201ProgramAlarm и @ Francois Andrieux в комментариях. Значение thread-max является общесистемным ограничением, и для создания гораздо большего количества потоков нам нужно внести некоторые изменения в настройки ядра:

...