Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/22: Рейтинг темы: голосов - 22, средняя оценка - 4.64
 Аватар для Union
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252

Обработка поступающих данных без задержки основного цикла

17.06.2011, 00:51. Показов 4528. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Получаю из какого-то соединения днс адреса сайтов. Считываю их из буфера в цикле. Один цикл - один днс. Нужно чтобы каждый днс переводился в ip и этот ip заносился вконец вектора. Но при этом основной цикл не должен тормозиться ни на миллисекунду, а функция преобразования dns -> ip всилу наличия пинга между моим компом и днс сервером и всилу наличия задержки у самого сервера - очень сильно тормозит... иногда на время более одной секунды. Что посоветуете в данном случае?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.06.2011, 00:51
Ответы с готовыми решениями:

Библиотека BASS (un4seen): возможна ли обработка звука в реальном времени без существенной задержки?
Здравствуйте. Если использовать приличный ноутбук с внешней (тоже приличной) звуковой картой, то можно ли обработать в реальном...

Обновление данных в базе без задержки
Поясните как обойти такой глюк: Я исользую два объекта работающие с одной и той же базой. adoMaterials - ADO Data Control ...

Обработка поступающих вложений doc
Уважаемый all! Я понимаю, что ворд на сервере это плохо, но пока увы. Проблема в том, что никак не удается наладить четкую обработку на...

42
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
17.06.2011, 01:21
псевдокодом обрисуйте вашу архитектуру... кто такой основной цикл. что там тормозит. и почему.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
17.06.2011, 08:50
И покажите
функция преобразования dns -> ip
0
 Аватар для Union
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
17.06.2011, 16:46  [ТС]
Ну типо вот как-то так:

C++
1
2
3
4
5
6
7
8
9
vect; // Вектор
 
while(0) { // Основной цикл
  buf; // Буфер
  recv(so, buf, BUF_SIZE, 0); // Считал из сокета so dns в буфер buf
  gethostbyname(buf); // Грубо говоря преобразовываем dns в буфере в ip... на самом деле эта функция немного не так работает... 
  vect.push_back(buf); // Загоняем ip в конец вектора...
  // Тут идет код, который должен выполняться не менее 30 раз в секунду...
}
Вот такая структура. Нужно чтобы цикл while(0) не тормозился функцией gethostbyname.
А функция gethostbyname срабатывает с задержкой, т.к. отсылает запрос на dns сервер, далее сервер долго думает и потом отсылает ip. Тормоза днс сервера и пинг создают общую задержку около секунды.
Я не совсем представляю как это сделать.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
17.06.2011, 17:42
Цитата Сообщение от Union Посмотреть сообщение
while(0)
забавно)))
Цитата Сообщение от Union Посмотреть сообщение
// Тут идет код, который должен выполняться не менее 30 раз в секунду...
Если используется адрес хоста из этой же интерации цикла, то в общем-то ничего поделать нельзя, что-то даст локальный кэширующий dns сервер, но лучше менять алгоритм.
Расскажите подробнее, что же делается с этим адресом в итоге.
0
 Аватар для Union
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
17.06.2011, 18:41  [ТС]
Всмысле while(1)
С этим адресом ничего не делается. Код, который выполняется дальше - математическая функция, считает уже свои задачи, никак не связанные с полученными dns и ip адресами.
Т.е. задача проста - нужно по dns получить ip и положить (залогировать) его в вектор и больше ничего с ним не делать, а дальше вычислять математическую задачку, и так в каждой итерации цикла.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
17.06.2011, 18:55
Может тогда просто запоминать в цикле имена, а ресолвить в отдельной ните потихоньку?
1
 Аватар для Union
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
17.06.2011, 19:08  [ТС]
Я смотрел реализации многопоточности и не нашел подходящего варианта. Они все направленны на распараллеливание сложных вычислений. А вот как создать отдельную нить и передавать в неё я не нашел таких примеров...
Направьте меня слегка в какую сторону капать
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
17.06.2011, 19:24
Цитата Сообщение от Union Посмотреть сообщение
Получаю из какого-то соединения днс адреса сайтов. Считываю их из буфера в цикле. Один цикл - один днс. Нужно чтобы каждый днс переводился в ip и этот ip заносился вконец вектора. Но при этом основной цикл не должен тормозиться ни на миллисекунду, а функция преобразования dns -> ip всилу наличия пинга между моим компом и днс сервером и всилу наличия задержки у самого сервера - очень сильно тормозит... иногда на время более одной секунды. Что посоветуете в данном случае?
Заводишь глобальный буфер (типа "очередь"). Создаёшь два потока (или основная задача плюс один поток). Первый поток в цикле читает адреса и записывает их в начало очереди. Второй поток в цикле читает из хвоста очереди, если очередь пустая, то спит, к пример, полсекунды, а потом опять пытается прочитать из очереди
1
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
17.06.2011, 19:25
man pthread_create
создавать 1 поток ресолвера или по потоку на клиента или еще как - решать вам.
Для ускорения процесса можно посмотреть в сторону асинхронных ресолверов.
1
 Аватар для Union
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
17.06.2011, 19:32  [ТС]
У меня через еполл уже реализовано. Нужно только логировать. Задам вопрос по конкретнее, какую многопоточность лучше всего использовать в данной задаче... если так можно выразиться, и может есть у кого небольшой пример именно заведения второго потока и передачи в него параметров, чтобы он их сам обработал и помещал куда-либо?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
17.06.2011, 19:36
Цитата Сообщение от Union Посмотреть сообщение
У меня через еполл уже реализовано
Реализовано что??? Я предлагаю заменить gethostbyname() на какой-нибудь асинхронный ресолвер. Например (сделаем модератору приятное) из boost.

Примеров в гугле да и на этом форуме полно - забейте в поиск pthread_create
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
17.06.2011, 19:52
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
забейте в поиск pthread_create
тут венда же скорее всего

очевидное решение - поток сидящий на семафоре
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
17.06.2011, 19:56
Цитата Сообщение от alex_x_x Посмотреть сообщение
тут венда же скорее всего
угу с epoll такая себе винда
0
 Аватар для Union
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
17.06.2011, 19:59  [ТС]
Не не, раздел же назван "С/С++ под Linux"
Не буду запариваться, использую pthread. Буду исходить из этого кода

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>
 
static void wait_thread(void)
{
    time_t start_time = time(NULL);
 
    while (time(NULL) == start_time)
    {
        /* do nothing except chew CPU slices for up to one second. */
    }
}
 
static void *thread_func(void *vptr_args)
{
    int i;
 
    for (i = 0; i < 20; i++)
    {
        fputs("  b\n", stderr);
        wait_thread();
    }
 
    return NULL;
}
 
int main(void)
{
    int i;
    pthread_t thread;
 
    if (pthread_create(&thread, NULL, thread_func, NULL) != 0)
    {
        return EXIT_FAILURE;
    }
 
    for (i = 0; i < 20; i++)
    {
        puts("a");
        wait_thread();
    }
 
    if (pthread_join(thread, NULL) != 0)
    {
        return EXIT_FAILURE;
    }
 
    return EXIT_SUCCESS;
}
Прокомментируйте пожалуйста строки с 34 по 42, не совсем понимаю как это работает... сначала wait_thread выполняется в отдельном потоке, а в строке 42 - в основном?
0
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
17.06.2011, 20:04
да, линукс же тема

Union, ? sem_t, pthread_mutex_t итп ?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
17.06.2011, 20:17
Цитата Сообщение от Union Посмотреть сообщение
сначала wait_thread выполняется в отдельном потоке, а в строке 42 - в основном
Правильнее будет сказать wait_thread выполняется и в отдельном потоке и в основном.
До 45й строки обе нити будут работать параллельно (ну или последовательно в случае одного цпу/не хватке ресурсов).
0
 Аватар для Union
17 / 17 / 0
Регистрация: 16.08.2010
Сообщений: 252
17.06.2011, 20:46  [ТС]
Т.е. на 42-ой строке вызываемая функция wait_thread() будет отрабатывать в основном потоке, а в 34 не в основном и вместе они парралельно отработают и закончат почти в одно и тоже время?
А чтобы не основной поток получал dns, преобразовывал его в ip и клал в вектор - мне получается просто нужно в нем создать цикл, и этим циклом постоянно проверять какой-то буфер, в который я заношу из основного потока dns'ки, так? Но тогда если буфер пуст - цикл будет крутиться постоянном проверяя буфер, полностью нагружая проц...? Что делать в этом случае?
Нужно как-то тормозить его через pthread_mutex?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
17.06.2011, 20:50
закончат почти в одно и тоже время?
Это не известно, "почти" может быть очень большим.

мьютекс тут наверное не к чему (точнее мьтексом можно обернуть операации с вектором или что там у вас будет вместо него), почитайте man pthread_cond_wait pthread_cond_signal
1
бжни
 Аватар для alex_x_x
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
17.06.2011, 21:06
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <pthread.h>
#include <semaphore.h>
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
 
#define QUEUE_LENGTH 10
 
struct critical
{
  sem_t* m_critical;
  int*  buffer;
};
 
void thread_f( void* param )
{
  struct critical* p = param;
  int i;
 
  if( !param )
  {
     return;
  }
  
  for( i=0;i<QUEUE_LENGTH;++i )
  {
     sem_wait( p->m_critical );
     printf( ">> %d\n", p->buffer[i] );    
  }
}
 
int main()
{
  int buffer[QUEUE_LENGTH], i;
  sem_t sem;
  pthread_t thread;
  struct critical critical = { &sem, buffer };
 
  pthread_create( &thread, 0, thread_f, &critical );
 
  sem_init( &sem, 0, 0 );
  for( i=0;i<QUEUE_LENGTH;++i )
  {
    buffer[i] = i;
    printf( "<< %dn", buffer[i] );
    usleep( 50 * 1000 );
    sem_post( &sem );
  }
 
  pthread_join( &thread, 0 );
 
  return 0;
}
типа того

http://liveworkspace.org/code/... 42c60bbfb5
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.06.2011, 21:06
Помогаю со студенческими работами здесь

Обработка всех запросов, поступающих на сервер
День добрый. Пишу анонаниамйзер, возник вопрос, как сохранить дерево каталогов донора в строке браузера? Т.е пример юзеру нужно...

Обработка строк, поступающих через COM порт
Доброго времени суток Необходимо обрабатывать строки сообщений поступающие по COM порту В Python 3.6 есть модуль parser Думаю применить...

Реализация задержки с использованием цикла
Перенесено из темы: https://www.cyberforum.ru/cmd-bat/thread1537879.html Многие интересуются, как сделать задержку по времени в...

Передача данных в регистр без использование цикла
Добрый день, прошу помощи. В данный момент в базе существует регистр накопления, который учитывает товары из документа о поступлении. То...

Scanner без задержки
Я, если честно, хреновый пользователь jav'ой, но кое-что знаю. Так вот: когда мы пишем стандартный sc.nextInt() (пусть int) всё...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru