Russian Qt Forum
Ноябрь 22, 2024, 18:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: многопоточное приложение опроса на 5000 устройств  (Прочитано 6976 раз)
pethead
Гость
« : Ноябрь 18, 2010, 17:02 »

subj

как правильно построить архитектуру не прибегая к созданию потока на каждое устройство.
каждое устройство требует непрерывного опроса состояния ну скажем раз в секунду.
устройства добавляются и удаляются не прерывая опрос остальных.

есть буржуйская разработка, там вроде на каждое устройство свой поток, потому что когда добавляешь девайс, прибавляется тред.
Записан
ufna
Гость
« Ответ #1 : Ноябрь 18, 2010, 17:09 »

а что за устройство и как может быть опрошено?
Записан
pethead
Гость
« Ответ #2 : Ноябрь 18, 2010, 17:20 »

какая разница. ну snmp.
Записан
alexman
Гость
« Ответ #3 : Ноябрь 18, 2010, 17:25 »

На каждое устройство по потоку больно жирно будет! Можно попробовать, чтобы один поток отвечал за группу устройств.
Записан
pethead
Гость
« Ответ #4 : Ноябрь 18, 2010, 17:44 »

вот такой пример создает 5000 тредов. легко. Улыбающийся
Код:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <signal.h>
#include <unistd.h>

#define NUM_THREADS     5000

volatile int while_condition = 1;

void sig_handler(int signal)
{
    while_condition = 0;
}

void *do_work(void *ptr) {
    size_t i = (size_t)ptr;
    while (while_condition) {
        sleep(1);
    }
    pthread_exit(NULL);
}

int main(int argc, char** argv) {
    pthread_t threads[NUM_THREADS];
    pthread_attr_t attr;
    void *ptr;
    size_t i;
    
    signal(SIGINT, sig_handler);

    /* Initialize and set thread detached attribute */
    pthread_attr_init(&attr);
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

    for (i = 0; i < NUM_THREADS; ++i)
    {
        printf("In main: creating thread %ld\n", i);
        int rc = pthread_create(&threads[i], &attr, do_work, (void *)i);
        if (rc) {
            printf("ERROR; return code from pthread_create() is %d\n", rc);
            exit(-1);
        }
    }

    /* Free attribute and wait for the other threads */
    pthread_attr_destroy(&attr);

    for (i = 0; i < NUM_THREADS; ++i)
    {
        int rc = pthread_join(threads[i], &ptr);
        if (rc) {
            printf("ERROR; return code from pthread_join() is %d\n", rc);
            exit(-1);
        }
        printf("In main: stopped thread %ld\n", i);
    }

    return (EXIT_SUCCESS);
}
только проверил. работает.
собирать так:
g++ -o threadtest -lpthread main.cpp
« Последнее редактирование: Ноябрь 18, 2010, 17:45 от pethead » Записан
ufna
Гость
« Ответ #5 : Ноябрь 18, 2010, 18:54 »

какая разница. ну snmp.

Разница есть. А snmp - оно вообще протокол )

Если snmp-устройства, то проще группировать по определенным признакам, и поток будет отвечать за группу. Сколько времени уходит на опрос устройства? Насколько критично соблюдение времени раз в секунду - т.е. может быть раз в 0.9 или раз в 1.2 секунды, с колебаниями?

5000 тредов, даже если можно сделать - все равно есть зло.
Записан
pethead
Гость
« Ответ #6 : Ноябрь 18, 2010, 19:00 »

вы спрашивали как может быть опрошено я ответил snmp. что это за протокол к проблеме не имеет значения.
группировать никак не получается - да и опрос в одном потоке нескольких девайсов , а если с ним последовательная связь по slip и каналу в 4бита в сек? остальные курят. мозготрах еще тот. а как же ооп?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Ноябрь 18, 2010, 19:47 »

Запускаете заданное число ниток (обычно = числу ядер). Складываете запросы в контейнер/очередь. Нитки выбирают из очереди запросы и обрабатывают их. В данном случае логично выглядит: нитка, опросив устройство, знает когда будет нужен следующий опрос - ну пусть она сохранит это время в данных нового запроса и положит его в очередь.

Синхронизация: все рабочие нитки ждут на семафоре. Одна специальная нитка в цикле проверяет есть ли в очереди запрос который пора обработать и если да - открывает семафор. Возможны и др. решения, это просто пример

Записан
pethead
Гость
« Ответ #8 : Ноябрь 18, 2010, 20:00 »

в умл уже накидали примерную картину запросов и очередей. рук-ль проекта морщится...
виды опросов разные: есть быстрые - запрос\ответ, есть долгие - запрос\ждем\ответ если тот еще запрос\ждем\ответ.
класс устройство должен положить запрос в очередь и ждать обработки т.е тоже цикл ожидания, но в главном потоке?
« Последнее редактирование: Ноябрь 18, 2010, 20:07 от pethead » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Ноябрь 18, 2010, 20:22 »

в умл уже накидали примерную картину запросов и очередей. рук-ль проекта морщится...
виды опросов разные: есть быстрые - запрос\ответ, есть долгие - запрос\ждем\ответ если тот еще запрос\ждем\ответ.
класс устройство должен положить запрос в очередь и ждать обработки т.е тоже цикл ожидания, но в главном потоке?
"Ждем" не проходит. Если ответ не мнгновенный, в очередь помещается новая задача (которая может быть обработана др. ниткой)
Записан
ufna
Гость
« Ответ #10 : Ноябрь 18, 2010, 22:41 »

pethead,

Как вариант - послушайте Игоря. Группировать можно, и подходы можно использовать различные. Подумайте как работают сервера игрушек на десятки тысяч пользователей?

Мозготрах - да, но Вам нужен результат или "просто"?
Записан
pethead
Гость
« Ответ #11 : Ноябрь 19, 2010, 05:41 »

всем спасибо, в след. раз как сделаем напишу как получилось.
надо и просто и быстро...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.147 секунд. Запросов: 23.