На практике EAGAIN почти всегда связан с нехваткой памяти для процесса. Часто это связано с размером стека, выделенного для потока, который вы можете настроить с помощью pthread_attr_setstacksize()
. Но существуют ограничения на количество процессов, которые вы можете запустить. Вы можете запросить жесткие и мягкие ограничения с помощью getrlimit()
, используя RLIMIT_NPROC в качестве первого параметра.
Здесь довольно много вопросов, посвященных отслеживанию потоков, их количеству, мёртвых или живых, и т. Д. Проще говоря, самый простой способ отследить их - это сделать это самостоятельно с помощью некоторого механизма, который вы кодируете , который может быть таким простым, как увеличение и уменьшение глобального счетчика (защищенного мьютексом) или что-то более сложное.
Открытые сокеты или другие файловые дескрипторы не должны вызывать сбой pthread_create()
. Если бы вы достигли максимума для дескрипторов, вы бы уже потерпели неудачу перед созданием нового потока, и новый поток уже должен был бы быть успешно создан, чтобы открыть больше из них, и, следовательно, не мог завершиться ошибкой с EAGAIN.