LINUX.ORG.RU

pthread_setcancelstate (...) сразу после accept (...)


0

0

Допустим есть такой код:
    ...
01    sock = accept (listener, NULL, NULL);
02    pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL); 
03    // ... тут что-нибуть делаем в sock
04    close (sock);
05    pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, NULL);
    ...
Всё это запускается в потоке. Вопрос:

Может ли случится так, что при вызове pthread_cancel(...),
поток остановится после 01 строчки, но до начала 02
(сокет будет создан, но не будет использован и закрыт)?

Смотря, что ты имеешь в виду под "остановится". Прерывание таймера и переключение на другую задачу считается?

mv ★★★★★
()
Ответ на: комментарий от LinuxUser

Прерывание таймера, переключение на другой тред, который делает pthread_cancel :) Или проще: SMP-машина, на другом проце делается pthread_cancel.

mv ★★★★★
()

Всем спасибо. Буду использовать функцию-обработчик завершения потока.

LinuxUser ★★★
() автор топика

Может, для этого нужно писать 02, 01, 03, 04, 05.

Если есть проблемы с блокирующим I/O, то poll(), fcntl(F_SETFL, O_SYNC/O_NONBLOCK) всегда прийдут на помощь.

ShprotX
()
Ответ на: комментарий от ShprotX

первая строчка должна быть ниже второй , тогда уже phread_cancel гарантированно ничем не сможет помешать закрыть сокет

kto_tama ★★★★★
()
Ответ на: комментарий от kto_tama

Если первая строчка будет ниже второй, то может так случится что pthread_cancel (...) будет вызвана в момент когда работает accept (...) и тогда поток завершится только когда присоединится и будет обработан клиент. Не факт что это быстро произойдёт. Поэтому и ставил pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, NULL) после accept (...).

LinuxUser ★★★
() автор топика
Ответ на: комментарий от LinuxUser

> Если первая строчка будет ниже второй, то может так случится что pthread_cancel (...) будет вызвана в момент когда работает accept (...) и тогда поток завершится только когда присоединится и будет обработан клиент

Выход - перевести сокет listener в non-blocking mode.

Кроме того, мне интерестно, что будет, если в другом варианте решения поток будет завершен внутри accept: до того как он вернет дескриптор файла и после того как соединение будет принято.

ShprotX
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.