LINUX.ORG.RU

Как приостановить выполнение потока под RedHat Linux 7.2?


0

0

В одном из мануалов по pthreads прочитал про функцию pthread_delay_np() , которая приостанавливает выполнение текуго потока на переданный интервал вермени. Но в своём redhat я её не нашёл. В общем мне нужен аналог функции Sleep() из WinAPI, которая приостановит выполнение текущего потока, например между чтением из сокета и запиью в него, на стоко-то мс.

AFAIK на RH 7.2 можно смело использовать для этого usleep()
По поводу последних ядер точно сказать не могу , но можно проверить.

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

Можно проверить ;) Вобще не должна, так как в 2.4 каждый тред идет отдельным процессом. В 2.6 и в ядрах последних RH 8-9 NTPL, поэтому это стоит проверить отдельно.

Dead ★★★★
()

Кроме unslip(), можно использовать select(), если нет функции,
которая осуществляет задержку меньше чем 1 сек. 

int select(int n, fd_set *readfds, fd_set  *writefds,  fd_set  *exceptfds,  
            struct timeval *timeout);

"...timeout -- это верхняя граница времени, которое пройдет перед 
возвратом из select. Можно использовать ноль, при этом  select  завершится  
немедленно.   Если  timeout  равен  NULL  (нет  тайм-аута),  то
  select  будет ожидать изменений неопределенное  время."

Таким образом можно реализовать задержку меньше чем секунда.
(man select, и в книжке по программированию под Unix/Linux) 

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

Спасибо за ответы, буду экспериментировать :)

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

select в данном случае по-любому не покатит, т.к. в нём задаётся верхнийи интервал времени, но нижнего может и н быть. Он может вообще сразу вернуть управление, если в сокете что-то есть.

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

>т.к. в нём задаётся верхнийи интервал времени, 
>но нижнего может и н быть.

Тебе и нужен верхний, сам подумай. :)
(ноль - нижний, возврышает сразу), почитай man или книжку.
Верхний - после которого ожидание прекращается - это и есть задержка.
Так делайтся тайм-ауты в серверах, чтоб убить зависший процесс.

usleep() - кроме как в Linux не реализована в других Unix-системах, 
там делают через select()

>Он может вообще сразу вернуть управление, если в сокете что-то есть.

Для selec() - не обязательно подсовывать дескриптор socket()
select - работает с любым дескриптором, open(), pipe(), socket().
Выбирай ... конечно в него не нужно ничего записывать,
он должен быть отдельно.

anonymous
()

в linux usleep() реализуется вызовом nanosleep(),
этим syscall'ом лучше и пользоваться напрямую.

в ntpl никаких сложностей не будет, "весь" процесс
остановлен не будет, для планировщика каждый поток
отдельный процесс по прежнему.

можно и select(), но зачем?

> Он может вообще сразу вернуть управление, если в сокете что-то есть.

так не надо ему передавать дескрипторы вообще.

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