LINUX.ORG.RU

usleep


0

0

Насколько безопасной является функция usleep применительно к pthread ?
У меня возникла проблема с TCP клиент-серверным приложением.
Оно начало грузить проц под 100%
Но стоило мне добавить в основной цикл usleep(100), как все пришло в норму.

Еще есть вариант с nanosleep :

struct timespec timeOut,remains; timeOut.tv_sec = 0; timeOut.tv_nsec = 5000; /* 50 milliseconds */

while (1) { //usleep(100); nanosleep(&timeOut, &remains);

iivvaann
() автор топика

(еще один говнокод)

какая именно сторона начала грузить проц?
сервер или клиент?

я более чем уверен, что у вас используется неправильный подход.

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

fd_set rfds;
struct timeval tv;
tv.tv_sec = 0;
tv.tv_usec = 1000;
int retval = 0 ;

for ( ; ; )
{
//usleep(10);
retval = select(1, &rfds, NULL, NULL, &tv);

Поставил я вот такой код - и проц сразу подскочил до 100% А в случае с usleep все нормально

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

>> что у вас используется неправильный подход.

А при чем тут подход ? Наберите программу , в которой будет один бесконечный цикл , поставьте в него usleep и пеосмотрите , что выдает топ

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

>один бесконечный цикл
это и есть неправильный подход!

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

Вы стивенса читали ?
Вот его пример сервера :
for ( ; ; )
{
rset = allset; /* structure assignment */
nready = Select(maxfd+1, &rset, NULL, NULL, NULL);

if (FD_ISSET(listenfd, &rset)) { /* new client connection */
clilen = sizeof(cliaddr);
connfd = Accept(listenfd, (SA *) &cliaddr, &clilen);


...
}

for (i = 0; i <= maxi; i++)
{ /* check all clients for data */
if ( (sockfd = client[i]) < 0)
continue;
if (FD_ISSET(sockfd, &rset)) {
if ( (n = Readline(sockfd, line, MAXLINE)) == 0) {
/*4connection closed by client */
Close(sockfd);
FD_CLR(sockfd, &allset);
client[i] = -1;
} else
Writen(sockfd, line, n);
...
}
}
}

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

Советую тебе его еще раз перечитать и обратить внимание на maxfd+1

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

посмотрев на это пример, я понял, что я его не читал явно к своему счастью!!

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

> retval = select(1, &rfds, NULL, NULL, &tv);

> 1

о Патрик…

и вообще от фрагмента кода фшоке…

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

> fd_set rfds;

- ты должен записать в этой структуре fd сокета который ты ждешь на событие - иначе ничего хорошего не будет.

> tv.tv_usec = 1000;

тебе действительно нужен таймаут в одну миллисекунду? У тебя в rfds уже какой-то номер файлового десктиптора, и 1000 раз в секунду тебе select возвращает что на этом fd есть данные (ессно ты их потом в своем цикле не считываешь) - вот у тебя и есть загрузка проца.

Почитай man select на предмет дескриптора, и пореже ставь таймауты от балды на одну миллисекунду.

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

tv, вроде, надо выставлять перед каждым вызовом select.

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