Сколько потоков создано по приведенному ниже коду и почему? - PullRequest
0 голосов
/ 02 апреля 2019

Я думаю, что функция будет создавать потоки, пока ресурсы не будут исчерпаны, но я запустил код и не вижу исчерпания ресурсов ..

DWORD WINAPI CreateThreads(LPVOID param)
{
    int n = *(int*)param;
    HANDLE* threads = (HANDLE*)malloc(n * sizeof(HANDLE));
    for (int i = 0; i < n; i++)
    {
        threads[i] = CreateThread(NULL,0, CreateThreads, &n, 0,NULL);
    }
    for (int i = 0; i < n; i++)
    {
        WaitForSingleObject(threads[i], INFINITE);
    }
    return 0;
}
int main()
{
      int n = 5;
      CreateThreads(&n);
      return 0;
}

1 Ответ

4 голосов
/ 02 апреля 2019

Windows защищает себя от этого типа истощения. CreateThread завершится неудачно, как только вы достигнете максимально допустимого количества потоков на процесс (как правило, около 2000 потоков для систем Windows, на которых я имел удовольствие разрабатывать)

Возможно, вы ожидали, что какой-то ресурс будет исчерпан первым, но есть много ресурсов, которые требуются потокам, и первый, исчерпавший себя, вызовет сбой при последующих вызовах CreateThread. Два основных ресурса, которые я могу использовать на своем опыте, - это виртуальная память из-за стека, необходимого каждому новому потоку, и ограничения количества потоков, которые ядро ​​может хранить в планировщике (механизм переключения контекста).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...