Detached threads

Тема в разделе "WASM.NETWORKS", создана пользователем Aiks, 13 дек 2017.

  1. Aiks

    Aiks Member

    Публикаций:
    0
    Регистрация:
    16 апр 2017
    Сообщения:
    109
    Адрес:
    Украина
    Привет! Я новичок в программировании под Linux. Подскажите пожалуйста, какой из предложенных вариантов является правильным. Если есть вариант получше, покажите его. Спасибо.

    P.S. Проверку возвращаемых значений опустил для простоты примеров.

    Вариант 1
    Код (C):
    1. void *process_connection(void *ps)
    2. {
    3.     int socket_fd = *(int*)ps;
    4.  
    5.     /*
    6.     ...
    7.     ...
    8.     */
    9.  
    10.     close(socket_fd);
    11. }
    12.  
    13. int main(int argc, char *argv[])
    14. {
    15.     pthread_t thread_id;
    16.     int rs, ls = getsocket(7000);
    17.  
    18.     while (true)
    19.     {
    20.         struct sockaddr_in clientaddr;
    21.         socklen_t clientaddr_size = sizeof(clientaddr);
    22.  
    23.         if ((rs = accept(ls, (struct sockaddr *)&clientaddr, &clientaddr_size)) < 0)
    24.         {
    25.             continue;
    26.         }
    27.  
    28.         pthread_attr_t attr;
    29.         pthread_attr_init(&attr);
    30.         pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    31.  
    32.         pthread_create(&thread_id, &attr, &process_connection, &rs);
    33.  
    34.         pthread_attr_destroy(&attr);
    35.     }
    36.  
    37.     exit(EXIT_SUCCESS);
    38. };
    Вариант 2
    Код (C):
    1. void *process_connection(void *ps)
    2. {
    3.     int socket_fd = *(int*)ps;
    4.  
    5.     /*
    6.     ...
    7.     ...
    8.     */
    9.  
    10.     close(socket_fd);
    11. }
    12.  
    13. int main(int argc, char *argv[])
    14. {
    15.     pthread_t thread_id;
    16.     int rs, ls = getsocket(7000);
    17.  
    18.     pthread_attr_t attr;
    19.     pthread_attr_init(&attr);
    20.     pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
    21.  
    22.     while (true)
    23.     {
    24.         struct sockaddr_in clientaddr;
    25.         socklen_t clientaddr_size = sizeof(clientaddr);
    26.  
    27.         if ((rs = accept(ls, (struct sockaddr *)&clientaddr, &clientaddr_size)) < 0)
    28.         {
    29.             continue;
    30.         }
    31.  
    32.         pthread_create(&thread_id, &attr, process_connection, &rs);
    33.     }
    34.  
    35.     exit(EXIT_SUCCESS);
    36. };
    Вариант 3
    Код (C):
    1. void *process_connection(void *ps)
    2. {
    3.     int socket_fd = *(int*)ps;
    4.  
    5.     /*
    6.     ...
    7.     ...
    8.     */
    9.  
    10.     close(socket_fd);
    11. }
    12.  
    13. int main(int argc, char *argv[])
    14. {
    15.     pthread_t thread_id;
    16.     int rs, ls = getsocket(7000);
    17.  
    18.     while (true)
    19.     {
    20.         struct sockaddr_in clientaddr;
    21.         socklen_t clientaddr_size = sizeof(clientaddr);
    22.  
    23.         if ((rs = accept(ls, (struct sockaddr *)&clientaddr, &clientaddr_size)) < 0)
    24.         {
    25.             continue;
    26.         }
    27.  
    28.         pthread_create(&thread_id, NULL, process_connection, &rs);
    29.  
    30.         pthread_detach(thread_id);
    31.     }
    32.  
    33.     exit(EXIT_SUCCESS);
    34. };
    Вариант 4
    Код (C):
    1. void *process_connection(void *ps)
    2. {
    3.     int socket_fd = *(int*)ps;
    4.  
    5.     /*
    6.     ...
    7.     ...
    8.     */
    9.  
    10.     close(socket_fd);
    11.  
    12.     pthread_exit(NULL);
    13. }
    14.  
    15. int main(int argc, char *argv[])
    16. {
    17.     pthread_t thread_id;
    18.     int rs, ls = getsocket(7000);
    19.  
    20.     while (true)
    21.     {
    22.         struct sockaddr_in clientaddr;
    23.         socklen_t clientaddr_size = sizeof(clientaddr);
    24.  
    25.         if ((rs = accept(ls, (struct sockaddr *)&clientaddr, &clientaddr_size)) < 0)
    26.         {
    27.             continue;
    28.         }
    29.  
    30.         pthread_create(&thread_id, NULL, process_connection, &rs);
    31.     }
    32.  
    33.     exit(EXIT_SUCCESS);
    34. };
     
    Последнее редактирование: 13 дек 2017
  2. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    По сути никакой особо разницы. Если следовать правилу "чем меньше лишнего делаем в цикле, тем лучше", то вариант 2 мне кажется оптимальным: не надо детачить поток после создания, и атрибуты создаются всего один раз. Только надо не забыть их задестроить после выхода из цикла.
     
    Aiks нравится это.
  3. Aiks

    Aiks Member

    Публикаций:
    0
    Регистрация:
    16 апр 2017
    Сообщения:
    109
    Адрес:
    Украина
    Спасибо. В примере №2 не делал вызов pthread_attr_destroy по причине вечного цикла. Если я правильно понимаю, то код после блока вечного цикла никогда не получит управление. А при закрытии программы система сама все подчистит.
     
  4. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Вечный цикл - тоже нехорошо, надо как-то из него выходить. По сигналу, например.
     
    Aiks нравится это.