pthread_create - не удалось создать поток errno 12 - PullRequest
0 голосов
/ 19 сентября 2019

Я создаю темы в программе для каждого входящего клиентского соединения.во время стресс-тестирования с 400 параллельными соединениями я получил ошибку 12 от pthread_create.я знаю, что это может случиться при исчерпании ресурсов, но не при 400 соединениях.так почему же это?

 #define MAX_CONNECTIONS 1000

pthread_t tid[MAX_CONNECTIONS];
        int i = 0;


        while(1) {

                        //Accept call creates a new socket for the incoming connection
                         addr_size = sizeof serverStorage;

                         // allocate socketfd on the heap to avoid nasty race conditions
                         int * socketfd;
                         socketfd = malloc(sizeof(int));

                         *socketfd = accept(listenfd, (struct sockaddr *) &serverStorage, &addr_size);

                        //create a thread for each client request and assign the client request to it for processing
                        //the main thread can now serve the next request
                        int err = pthread_create(&tid[i], NULL, socketThread, socketfd);
                        if(err) {
                                slog_error(0,"Failed to create thread %d",err);
                                exit(3);
                        }

                        if( i >= MAX_CONNECTIONS)
                        {
                                i = 0;
                                while( i < MAX_CONNECTIONS )
                                {
                                        pthread_join(tid[i++],NULL);
                                }
                                i = 0;
                        }



всплывающая часть темы


                   if(injector) {
                        DEBUG slog_debug(0, "injector reached");
                        DEBUG slog_debug(0,"Starting injector helper %s",injector_command);
                        errno = 0;
                        if ( (pop = popen(injector_command, "w") ) == NULL ) {
                        slog_error(0,"popen injector FAILED continue without injection %d",errno);
                        pop = 0;
                        }
                        if (pop) {
                                DEBUG slog_debug(0, "print to injector reached");
                                if( (bytes = fwrite(nm_data,1,strlen(nm_data),pop)) != strlen(nm_data)) {
                                        slog_error(0,"Failed to write to injector %s,%s,%d",hostname,bytes,errno);
                                        pop = (FILE *)0; /* stop writing */
                                        exit(1);
                                }
                        }
                        fflush(pop);
                        pclose(pop);

                    }

1 Ответ

0 голосов
/ 23 сентября 2019

pthread_create (& tid [i], NULL, socketThread, & socketfd) создает неприятное состояние гонки.Вы столкнетесь с реальными проблемами, если другой вызов accept () вернется до того, как созданный вами поток разыменует адрес, чтобы получить свой сокет.см. код обновления в начальном вопросе.

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