Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: pethead от Ноябрь 18, 2010, 17:02



Название: многопоточное приложение опроса на 5000 устройств
Отправлено: pethead от Ноябрь 18, 2010, 17:02
subj

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

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


Название: Re: многопоточное приложение опроса на 5000 устройств
Отправлено: ufna от Ноябрь 18, 2010, 17:09
а что за устройство и как может быть опрошено?


Название: Re: многопоточное приложение опроса на 5000 устройств
Отправлено: pethead от Ноябрь 18, 2010, 17:20
какая разница. ну snmp.


Название: Re: многопоточное приложение опроса на 5000 устройств
Отправлено: alexman от Ноябрь 18, 2010, 17:25
На каждое устройство по потоку больно жирно будет! Можно попробовать, чтобы один поток отвечал за группу устройств.


Название: Re: многопоточное приложение опроса на 5000 устройств
Отправлено: pethead от Ноябрь 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


Название: Re: многопоточное приложение опроса на 5000 устройств
Отправлено: ufna от Ноябрь 18, 2010, 18:54
какая разница. ну snmp.

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

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

5000 тредов, даже если можно сделать - все равно есть зло.


Название: Re: многопоточное приложение опроса на 5000 устройств
Отправлено: pethead от Ноябрь 18, 2010, 19:00
вы спрашивали как может быть опрошено я ответил snmp. что это за протокол к проблеме не имеет значения.
группировать никак не получается - да и опрос в одном потоке нескольких девайсов , а если с ним последовательная связь по slip и каналу в 4бита в сек? остальные курят. мозготрах еще тот. а как же ооп?


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

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



Название: Re: многопоточное приложение опроса на 5000 устройств
Отправлено: pethead от Ноябрь 18, 2010, 20:00
в умл уже накидали примерную картину запросов и очередей. рук-ль проекта морщится...
виды опросов разные: есть быстрые - запрос\ответ, есть долгие - запрос\ждем\ответ если тот еще запрос\ждем\ответ.
класс устройство должен положить запрос в очередь и ждать обработки т.е тоже цикл ожидания, но в главном потоке?


Название: Re: многопоточное приложение опроса на 5000 устройств
Отправлено: Igors от Ноябрь 18, 2010, 20:22
в умл уже накидали примерную картину запросов и очередей. рук-ль проекта морщится...
виды опросов разные: есть быстрые - запрос\ответ, есть долгие - запрос\ждем\ответ если тот еще запрос\ждем\ответ.
класс устройство должен положить запрос в очередь и ждать обработки т.е тоже цикл ожидания, но в главном потоке?
"Ждем" не проходит. Если ответ не мнгновенный, в очередь помещается новая задача (которая может быть обработана др. ниткой)


Название: Re: многопоточное приложение опроса на 5000 устройств
Отправлено: ufna от Ноябрь 18, 2010, 22:41
pethead,

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

Мозготрах - да, но Вам нужен результат или "просто"?


Название: Re: многопоточное приложение опроса на 5000 устройств
Отправлено: pethead от Ноябрь 19, 2010, 05:41
всем спасибо, в след. раз как сделаем напишу как получилось.
надо и просто и быстро...