Я написал код C / C ++, который реализует соединение через сокет, и основной поток находится в режиме непрерывного прослушивания цикла на своем порту. Когда к этому порту приходит запрос на соединение, я порождаю поток с помощью вызовов pthread и выгружаю работу в этом потоке. Таким образом, у меня ‘n’ потоки создаются динамически для ‘n’ входящих запросов.
Проблема в том, что, если один поток завершается, основной поток также завершается.
Я использовал pthread_join (), но он ожидает окончания потока в аргументе. В моем случае новые потоки не создаются после вызова pthread_join ().
pthread_t t;
while(1) //server always to be in listen mode
{
client_len=sizeof(client_sockaddr);
client_sockfd=accept(server_sockfd,(struct sockaddr*)&client_sockaddr,&client_len);pthread_create(&t,NULL,server_thread,(void*)client_sockfd);
(void)pthread_join(t,NULL);
}
Если вас не волнует возвращаемое значение из ваших потоков и вас не интересует, когда они завершатся, то вам следует отсоединить их с помощью pthread_detach
или просто создайте их в отдельном состоянии для начала:
pthread_attr_t thread_attr;
pthread_attr_init(&thread_attr);
pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
while(1) //server always to be in listen mode
{
client_len=sizeof(client_sockaddr);
client_sockfd=accept(server_sockfd,(struct sockaddr*)&client_sockaddr,&client_len);
pthread_t t;
pthread_create(&t,&thread_attr,server_thread,(void*)client_sockfd);
}
pthread_attr_destroy(&thread_attr);
добавлять printf("check string\n");
после pthread_join
в вашем коде. скомпилируйте и запустите его сейчас. Вы можете получить представление о своей проблеме.
Вы не встретите функцию printf.
Причина поведения pthread_join
будет ждать первого созданного потока, чтобы закончить работу.
поэтому до тех пор, пока первый поток не завершит работу, новый поток не будет создан. Таким образом, ваш код не будет принимать любое новое клиентское соединение.
Так что не используйте pthred_join
внутри вашего while(1)
тогда ваша проблема будет решена.
pthread_join в основном полезен, когда основной процесс хочет дождаться, пока поток завершит работу.