Это мой код для создания некоторых тем. Я хочу создать 500 потоков одновременно, не более. Легко, но мой код не удался после создания 32ххх потоков.
Тогда я не понимаю, почему я получаю код ошибки 11 после 32751 потоков, потому что каждый поток закончился.
Я могу понять, если потоки не выходят, то 32751 потоков на одном компьютере … но здесь каждый поток завершается.
Вот мой код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
void *test_tcp(void *);
int main ()
{
pthread_t threads[500];
int pointeur_thread;
unsigned long compteur_de_thread=0;
long ttt=0;
int i;
for(int i=0;i<=1000000;i++)
{
ttt++;
pointeur_thread=pthread_create(&threads[compteur_de_thread],NULL,test_tcp,NULL);
if (pointeur_thread!=0)
{
printf("Error : %d\n",pointeur_thread);
exit(0);
}
printf("pointeur_thread : %d - Thread : %ld - Compteur_de_thread : %ld\n",pointeur_thread,compteur_de_thread,ttt);
compteur_de_thread++;
if (compteur_de_thread>=500)
compteur_de_thread=0;
}
printf("The END\n");
}
void *test_tcp(void *thread_arg_void)
{
pthread_exit(NULL);
}
Вы, вероятно, получаете значение ошибки, которое соответствует EAGAIN, что означает: Недостаточно ресурсов для создания другого потока.
Проблема в том, что вы не присоединяетесь к своим потокам после их выхода. Это можно сделать в операторе if, где вы проверяете, все ли идентификаторы были использованы: if (compteur_de_thread>=500)
,
Просто зациклите массив и вызовите pthread_join
на элементах указанного массива.
Другим вариантом, помимо присоединения к потокам, будет отсоединение каждого потока. Отдельный поток освобождает все свои ресурсы в тот момент, когда он заканчивается.
Для этого просто позвоните
pthread_detach(pthread_self());
внутри функции потока.
Если это так, позаботьтесь о также покинуть программу main()
позвонив pthread_exit()
(вместо просто return
или exit()
в), как будто не хватает, main()
выйдет не только из самого себя, но и из всего процесса, и при этом будут удалены все потоки процесса, которые все еще могут выполняться.
Спасибо всем.
Я заменяю «pthread_exit (NULL);» от «pthread_detach (pthread_self ());» и сейчас идеально.
Я думал, что выход означает «Закрыть поток», и я думал, что отсоединение означает «Поток в ожидании»
Но нет 🙂
Спасибо всем.
Christophe