Привет! Я новичок в программировании под Linux. Подскажите пожалуйста, какой из предложенных вариантов является правильным. Если есть вариант получше, покажите его. Спасибо. P.S. Проверку возвращаемых значений опустил для простоты примеров. Вариант 1 Код (C): void *process_connection(void *ps) { int socket_fd = *(int*)ps; /* ... ... */ close(socket_fd); } int main(int argc, char *argv[]) { pthread_t thread_id; int rs, ls = getsocket(7000); while (true) { struct sockaddr_in clientaddr; socklen_t clientaddr_size = sizeof(clientaddr); if ((rs = accept(ls, (struct sockaddr *)&clientaddr, &clientaddr_size)) < 0) { continue; } pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(&thread_id, &attr, &process_connection, &rs); pthread_attr_destroy(&attr); } exit(EXIT_SUCCESS); }; Вариант 2 Код (C): void *process_connection(void *ps) { int socket_fd = *(int*)ps; /* ... ... */ close(socket_fd); } int main(int argc, char *argv[]) { pthread_t thread_id; int rs, ls = getsocket(7000); pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); while (true) { struct sockaddr_in clientaddr; socklen_t clientaddr_size = sizeof(clientaddr); if ((rs = accept(ls, (struct sockaddr *)&clientaddr, &clientaddr_size)) < 0) { continue; } pthread_create(&thread_id, &attr, process_connection, &rs); } exit(EXIT_SUCCESS); }; Вариант 3 Код (C): void *process_connection(void *ps) { int socket_fd = *(int*)ps; /* ... ... */ close(socket_fd); } int main(int argc, char *argv[]) { pthread_t thread_id; int rs, ls = getsocket(7000); while (true) { struct sockaddr_in clientaddr; socklen_t clientaddr_size = sizeof(clientaddr); if ((rs = accept(ls, (struct sockaddr *)&clientaddr, &clientaddr_size)) < 0) { continue; } pthread_create(&thread_id, NULL, process_connection, &rs); pthread_detach(thread_id); } exit(EXIT_SUCCESS); }; Вариант 4 Код (C): void *process_connection(void *ps) { int socket_fd = *(int*)ps; /* ... ... */ close(socket_fd); pthread_exit(NULL); } int main(int argc, char *argv[]) { pthread_t thread_id; int rs, ls = getsocket(7000); while (true) { struct sockaddr_in clientaddr; socklen_t clientaddr_size = sizeof(clientaddr); if ((rs = accept(ls, (struct sockaddr *)&clientaddr, &clientaddr_size)) < 0) { continue; } pthread_create(&thread_id, NULL, process_connection, &rs); } exit(EXIT_SUCCESS); };
По сути никакой особо разницы. Если следовать правилу "чем меньше лишнего делаем в цикле, тем лучше", то вариант 2 мне кажется оптимальным: не надо детачить поток после создания, и атрибуты создаются всего один раз. Только надо не забыть их задестроить после выхода из цикла.
Спасибо. В примере №2 не делал вызов pthread_attr_destroy по причине вечного цикла. Если я правильно понимаю, то код после блока вечного цикла никогда не получит управление. А при закрытии программы система сама все подчистит.