pthread_exit(NULL); не работает

Это мой код для создания некоторых тем. Я хочу создать 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);
    }

3 ответа

Решение

Вы, вероятно, получаете значение ошибки, которое соответствует 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

Другие вопросы по тегам