powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Linux C++ потоки
69 сообщений из 69, показаны все 3 страниц
Linux C++ потоки
    #39260442
arias
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток, у меня следующая проблема. У меня есть список типа vector<string>, в котором приблизительно 25 000 строк, суть программы в следующем, нужно в потоках обработать данные строки(строка представляет собой домен для последующего получения ip адресов), как можно быстрее. На данный момент, программа ругается в тот момент, как вызывается первый экземпляр объекта потока, а именно в следующем строке: pthread_join(threads[0], NULL); , дальше не идет программа, в чем может быть проблема? Вот ошибка: dpi kernel: [ 3366.211960] dpi[11554]: segfault at 4 ip b76dc056 sp bf809700 error 6 in libpthread-2.19.so[b76d6000+18000]
Код: plaintext
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.
void* threadFunc(void* thread_data)  {
  string domain = *(string *)thread_data;
  syslog(LOG_INFO, "Info: domain in = %s", domain.c_str());
  struct hostent *he;
  struct in_addr **addr_list;
  syslog(LOG_INFO, "Info: domain search information");
  if((he = gethostbyname(domain.c_str())) == NULL)
    syslog(LOG_NOTICE, "Notice: Not found IP addresses for host - \"%s\"", domain.c_str());
  else  {
    addr_list = (struct in_addr **)he->h_addr_list;
    for(int j = 0; addr_list[j] != NULL; j++)
      syslog(LOG_INFO, "Info: Found IP address \"%s\" for host - \"%s\"", inet_ntoa(*addr_list[j]), domain.c_str());
  }
  syslog(LOG_INFO, "Info: domain write information");
  pthread_exit(NULL);
  return NULL;
}

int find_ip2(vector<string> domains)  {
  int n = domains.size();
  pthread_t threads[n];

  syslog(LOG_INFO, "Info: count domains = %d", n);

  for(int j = 1, i = 0; j < n ; j++, i++)  {
     syslog(LOG_INFO, "Info: %d. domain = %s", j, domains[j].c_str());
     syslog(LOG_INFO, "Info: %d. count domains = %d", j, n);
     syslog(LOG_INFO, "Info: %d. domain send = %s", j, domains[j].c_str());
     syslog(LOG_INFO, "Info: %d. domain %d -> set = %s", j, (i + 1), domains[j].c_str());
     pthread_create(&threads[i], &tattr, threadFunc, &domains[j]);
  }

  syslog(LOG_INFO, "Info: start clearing thread!");

  for(int t = 0 ; t < n ; t++)  {
    syslog(LOG_INFO, "Info: threads[%d] join(%d joins)!", t, n);
    pthread_join(threads[t], NULL);
  }

  syslog(LOG_INFO, "Info: domain finish search ips.");

  return n;
}
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260474
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ariasУ меня есть список типа vector<string>, в котором приблизительно 25 000 строк
Это vector<string> domains ?

Попробуй оставить 25 строк. Будет работать?
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260476
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Непонятно где инстнциируется &tattr. Может это необязательно но хотелось-бы чтоб сорс был самодостаточный.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260490
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И... не знаю реально-ли стартовать 25 тыщ потоков. Тут по идее должнен быть какой-то диспетчер
типа Круглый-Робин.

А так по коду получается что на каждый домен будет форкнут тред.

И + надо анализировать коды возврата. Возможно там где-то что-то падает.

http://man7.org/linux/man-pages/man3/pthread_create.3.html On success, pthread_create() returns 0; on error, it returns an error
number, and the contents of *thread are undefined.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260491
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можешь потоки на std::thread переделать, там синтаксис попроще и приведение типов не требуется.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260497
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто не надо создавать 25000 потоков )))

Переделайте алгоритм, чтобы потоков было достаточное, но небольшое число. Например 2*число CPU.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260507
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky, я думаю что для Linux не очень сложно создать 25 тыщ потоков.
Просто ... как-то умеючи надо. Покурить там текущее значение /proc/sys/kernel/threads-max.
Покурить откуда оно ставит дефолт. Возможно там какая-то оценочная формула есть.
От мемори там или от версии ядра.

Но конечно постановка - причудливая. Какой-то DNS сервер....
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260518
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonAnatoly Moskovsky, я думаю что для Linux не очень сложно создать 25 тыщ потоков.
Каждому потоку 1 Мб стэка надо выделить, это 25 Гб адресного пространства. ХЗ выделит ли столько ОС для одного процесса.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260521
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonAnatoly Moskovsky, я думаю что для Linux не очень сложно создать 25 тыщ потоков.
Каждому потоку 1 Мб стэка надо выделить, это 25 Гб адресного пространства. ХЗ выделит ли столько ОС для одного процесса.
Мы не знаем какое там выделение. Возможно отложенное. У тебя линухЪ под рукой?
Глянь плиз чему у тебя равна эта переменная.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260530
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
...:~# cat /proc/sys/kernel/threads-max
7873
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260535
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну... всего-лишь в 4 раза меньше

Кстати чортов homepage Сергея Брина мне подсказывает что размер
стека можно "уплотнить".

Волшебная функция нам в помошь.

Код: plaintext
1.
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260615
arias
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По поводу "&tattr" описался, когда писал сообщение, в реальном коде этого куска уже нет давно.
Вроде установка 20 потоков решило проблему, я пытался экспериментировать с количеством одновременных потоков, хотя сколько примеров не смотрел, нигде не описано максимальное чисто одновременных потоков.
По поводу максимального числа потоков в системе у меня следующий вывод:
Код: plaintext
1.
2.
cat /proc/sys/kernel/threads-max
64523


Всем спасибо, буду дальше разбираться с кодом. Сложно вспоминать C++, после того, как пару лет пришлось писать на PHP.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260626
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ariasПо поводу "&tattr" описался, когда писал сообщение, в реальном коде этого куска уже нет давно.
Было-бы очень продуктивно приводить актуальный исходник.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260663
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ariasхотя сколько примеров не смотрел, нигде не описано максимальное чисто одновременных потоков.
Одновременно может выполняться столько потоков, сколько логических процов доступно ОС. Где-то их 2 где-то 40 и больше. Если в очереди на исполнение больше, то это только вызовет лишние тормоза из-за переключения потоков.
Потом зависит от того что твои потоки делают, если поток ждет ввод/вывод, то в это время проц может другой поток поработать.
Создание потока тоже не дешевое действие, поэтому обычно делают пул потоков, которые висят и ждут задания, есть задание - обработали, дальше ждут. Как у тебя написано: создать поток ради пары строк кода, это как купить квартиру чтобы разок переночевать.
Почитай какую-нибудь книжку про многопоточность.

Это нездоровая строчка
Код: plaintext
1.
pthread_t threads[n];


в современном С++ это можно, но при больших n будут проблемы, т.к. массив создается на стэке, а стэк всего 1Мб. маленькие массивы можно так делать, а с большими аккуратно, лучше заменить на vector.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260671
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дим ты не совсем прав. Твоя формула "логических процов" справедлива для численных методов.
Но ты открой свой собственный диспетчер задач и посмотри сколько процессов и сколько потоков
в каждом (если Windows).
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260697
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДим ты не совсем прав. Твоя формула "логических процов" справедлива для численных методов.
я формулы не давал, попытался объяснить что универсальной формулы нет, а для конкретного приложения ее надо выводить с учетом особенностей приложения, может не очень понятно написал.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260705
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если выкинуть всякий лишний мусор типа логгирования то поток делает 1 единственный
полезный вызов

Код: plaintext
1.
gethostbyname(domain.c_str())



и его архитектуру следует обсуждать.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260719
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonи его архитектуру следует обсуждать.
Тут обсуждать особо нечего, надо самодельный запрос DNS-серверу. Тут протокол DNS надо поизучать чтоб не слать 25000 UDP пакетов. Вроде по TCP тоже можно. 1 поток.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260734
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вики пишет
Протокол DNS использует для работы TCP- или UDP-порт 53 для ответов на запросы.
Традиционно запросы и ответы отправляются в виде одной UDP-датаграммы. TCP используется,
когда размер данных ответа превышает 512 байт, и для AXFR-запросов.

Да тут надо раскурить особенности протокола и подстроить под него софт. Тоесть не DDOS-ить
бедного провайдера а настроить некую номинальную скорость при которой нет шейпинга
и авто-ограничителей. Я-бы еще обратил внимание на возможные дубли доменов.

Кстати используя свойство распределённости DNS, запросы можно слать во много направлений
пока хватает сетевого канала. Это КМК более благоприятный путь оптимизации.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260748
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХУ не тот случай. Слать на ближайший. 25000 запросов это не много, не DDoS. Чуть нагрузят сервер, но максимум за секунду на все ответит.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260775
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
25 тысяч пакетов.... вобе стороны.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260782
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать поднять локальный DNS, и спрашивать у него.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260825
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonне очень сложно создать 25 тыщ потоков
Шею себе сломать тоже не сложно, и что? )))
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260830
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton25 тысяч пакетов.... вобе стороны.
Чтобы обрабатывать 100К пакетов объемом 1Гбит в секунду хватает недорогого 4 ядерного проца.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260850
Shaman_Ist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС уже "отвалился", но, никто из отвечающих, не выспросил у него: "а на фейхуа" ему собирать DNS-info многопорочно :).
Получение информации ограничено скоростью канала. И наплевать на то, сколько потоков (процессов) стучится в него с запросами . Ибо создание и запуск процессов в Linux ныне (на современных процессорах) заведомо быстрее ответов от DNS сервера. Получается от кучи процессов профита нет, а ОЗУ кушаем. И то, если настройки ядра ОС позволят столько процессов (потоков) создать и, соответственно, запустить.
Функция gethostbyname( как, справедливо заметил mayton, единственно payload в приведенном фрагменте кода), помнится, синхронная? Еще минус в копилку "кучи процессов", опять же из-за памяти.
А поднятие локального DNS не очень-то похоже на здравый совет, ибо задача, обрисованная ТС, оченно похожа на "кеширующий DNS на этапе построения таблицы".
В итоге: неизвестно, чего хотел ТС, но советы от Dima_T, mayton довольно во многом применимы. Сказанное Анатолием (Anatoly Moskovsky) может и должно (но не все) быть принято к сведению.
Засим откланиваюсь, ибо не совсем трезв.
Поздравьте нас (я, сестра и зять) с рождением нового Тамерлана ;).
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260858
Shaman_Ist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. А ежели ТС пытается писать софт для коммутаторов "многогигабитных" тем более подобную модель поведения -> Шервуд (лесом, короче).
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39260863
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так не надо тут никого в Шервуд посылать. Иди бухай себе с миром
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39261408
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonИ... не знаю реально-ли стартовать 25 тыщ потоков. Тут по идее должнен быть какой-то диспетчер
типа Круглый-Робин.



не то, чтобы нереально, но просто напросто бессмысленно.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39261412
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДим ты не совсем прав. Твоя формула "логических процов" справедлива для численных методов.
Но ты открой свой собственный диспетчер задач и посмотри сколько процессов и сколько потоков
в каждом (если Windows).


все он прав.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39261421
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле для этой задачи вообще многопоточность не нужна.
Нужно асинхронное выполнение заданий в одном потоке.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39261601
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНа самом деле для этой задачи вообще многопоточность не нужна.
Нужно асинхронное выполнение заданий в одном потоке.
Да это было-бы самое правильное. Интересно почему автор с этого не начал?

А оптимизация - это было-бы уже фаза номер 2.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39262150
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почитал тему. поржал. вобще поржал. 25 000 потоков! столько я не делал даже для неронной сети ))

есть http://docs.libuv.org/en/v1.x/dns.html
есть boost.asio
есть std::thread, но поток нужен максимум один - для io_loop.

если тс надо, могу скинуть uvbind который я недавно написал для себя (обертка над libuv, очень простая, только там нет dns, надо прикрутить).

мне кажется от 25 000 потокв система загнется (если они все хотят попасть на процессор а не ждут своего io). но может и нет, я не эсперементировал.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39262173
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexy_blackпочитал тему. поржал. вобще поржал
alexy_blackесли тс надо, могу скинуть uvbind который я недавно написал для себя (обертка над libuv, очень простая, только там нет dns, надо прикрутить).
Сам поржал - дай другому. ТС вообще-то как раз DNS и нужен, нафига ему обертка которая этого не умеет, проще с нуля сделать .

Вот накидал за 5 минут.
Асинхронно выводит все IP указанных хостов или ошибку если хост не найден.
В одном потоке.
Код: plaintext
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.
#include <boost/asio.hpp>
#include <iostream>
#include <string>
#include <vector>

int main()
{
    std::vector<std::string> hosts = {"google.com", "yandex.ru"};
    boost::asio::io_service service;
    boost::asio::ip::tcp::resolver resolver(service);
    for (const auto& host: hosts) {
        boost::asio::ip::tcp::resolver::query query(host, "");
        resolver.async_resolve(
                    query,
                    [host](boost::system::error_code ec, boost::asio::ip::tcp::resolver::iterator iter)
        {
            if (ec) {
                std::cout << host << " -> " << ec.message() << std::endl;
                return;
            }
            boost::asio::ip::tcp::resolver::iterator end;
            while (iter != end) {
                auto endpoint = (iter++)->endpoint();
                std::cout << host << " -> " << endpoint.address() << std::endl;
            }

        });
    }
    service.run();

    return 0;
}
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39262175
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Мне кажется, можно упростить
boost::asio::ip::tcp::resolver::iterator end => cpp::end of use
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39262176
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemargl,

Вернемся к этому вопросу через 10 лет, когда про D уже забудут
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39262182
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySiemargl,

Вернемся к этому вопросу через 10 лет, когда про D уже забудут Про D может и забудут, хотя он тут не упоминался.

Но такой синтаксис ++ еще вопрос сколько народа будет использовать. Лично я - уже маловероятно.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39262185
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SiemarglПро D может и забудут, хотя он тут не упоминался.
Ну, это единственный реальный кандидат на cpp::end of use. Рад что вы осознаете его шансы )))
А остальные поделки в лучшем случае могут друг друга заменить ))
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39262285
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С буст-асио код смотрится тяжеловато.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39262291
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonС буст-асио код смотрится тяжеловато.
Напишите за 5 минут любой другой аналог - сравним
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39262305
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskymaytonС буст-асио код смотрится тяжеловато.
Напишите за 5 минут любой другой аналог - сравним
Увы не смогу. Я уже давно не участник олимпиад и хакатонов и я ничего не пишу за 5 минут.

Но я попробую на досуге написать DNS-резольвер только надо найти хороший список хостов
в количестве 25 0000 строк чтоб смоделировать 1 тест на корректность.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39262367
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonС буст-асио код смотрится тяжеловато.если не ошибаюсь тут не нужно будет даже подключать какую-нибудь библиотеку, это только заголовочная библиотека. что тут тяжолово?
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39262392
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сорс тяжело читать. Если-бы я делал это на Java то это наверное был-бы
Fork-Join пул потоков в качестве платформы для исполнения и лямбды
в качестве описания алгоритма. Благо он прост. Надо взять поток строк
из файла и передать их набору исполнительных потоков для DNS-ресольвинга
и результат куда-то слить в коллекцию.

Я еще с лямбдами пока на "вы" но наверное кто-то напишет это быстрее меня.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39265990
Пётр Седов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arias
Код: plaintext
1.
2.
3.
int find_ip2(vector<string> domains)  {
  ...
}

Лучше передавать по const-ссылке, чтобы не копировать контейнер:
Код: plaintext
1.
int find_ip2(const vector<string>& domains) {


Shaman_IstмногопорочноОтличный термин.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266030
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Многопорочно - это прямо про отладку асио, удачное определение.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266039
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky....Вот накидал за 5 минут.
Асинхронно выводит все IP указанных хостов или ошибку если хост не найден.
В одном потоке.

maytonСорс тяжело читать. Если-бы я делал это на Java то это наверное был-бы
Fork-Join пул потоков в качестве платформы для исполнения и лямбды
в качестве описания алгоритма.....
????
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266058
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskymaytonС буст-асио код смотрится тяжеловато.
Напишите за 5 минут любой другой аналог - сравним


В тему cpp::end of use

40 секунд.....

Код: plaintext
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.
$ cat resolv
www.google.com
www.yandex.ru
www.sql.ru


$ for domain in `cat resolv` ; do  nslookup $domain | egrep 'Name|Address' ; done 
Name:	www.google.com
Address: 173.194.71.106
Name:	www.google.com
Address: 173.194.71.147
Name:	www.google.com
Address: 173.194.71.99
Name:	www.google.com
Address: 173.194.71.103
Name:	www.google.com
Address: 173.194.71.104
Name:	www.google.com
Address: 173.194.71.105
Name:	www.yandex.ru
Address: 77.88.55.55
Name:	www.yandex.ru
Address: 77.88.55.66
Name:	www.yandex.ru
Address: 5.255.255.5
Name:	www.yandex.ru
Address: 5.255.255.55
Name:	www.sql.ru
Address: 89.188.113.172
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266093
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да это любой Unix-админ сделает. Автору покажите. Ему ж на сях надо...
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266104
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonДа это любой Unix-админ сделает. Автору покажите. Ему ж на сях надо...


На сях такие вещи надо писать в случае необходимости глубокого
тюнинга сетевого протокольного взаимодействия

Для общих случаев и стандартных протоколов
есть масса готовых инструментов и полуфабрикатов
типа xinetd, netcat, nginx, haproxy, etc.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266149
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonДа это любой Unix-админ сделает. Автору покажите. Ему ж на сях надо...

Многих начинающие в Unix сбиваются с пути истинного...

потоки и мутексы это не Unix-way.

Unix way - это процессы, конвееры и классический IPC ( разделяемая память,
семафоры, очереди, сокеты).

Сбившись один раз с пути люди
начинают изобретать костыли по поводу и без....

...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266179
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0kВ тему cpp::end of use

40 секунд.....
Код: plaintext
1.
for domain in `cat resolv` ; do  nslookup $domain | egrep 'Name|Address' ; done



Это не то что требовалось.
Надо параллельно резолвить.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266191
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
UNIX - это конструктор-лего в нем есть в том чисте и нити с мутексами
и в нем нужно уметь писать на С,
но очень часто в этом нет необходимости.

Я никоим образом не пытаюсь начать холивар :)

Я о том что Юникс создавался инженерами для инженеров
в классической UNIX архитектуре ПО , не составляет
никакого труда заменить модуль в конвеере обработки алгоритма
с С-шного на перловый, башовый, питоновый и наоборот
с минимальными накладными расходами....
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266204
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы не конструктивны по отношению к автору. И мы не можем подменять ТЗ просто так по своему умозрению.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266236
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonМы не конструктивны по отношению к автору. И мы не можем подменять ТЗ просто так по своему умозрению.

Форкнуть 5 .. 10 .. 20 ... 100 или какая степень паралелизма ему там нужна
nslookup
и по факту прихода сигнала SIGCHLD запускать
следующий форк из списка доменов постоянно поддерживая нужно степень паралелизма.
Пока nslookup-ы резолвят , процесс их запустивший парсит резульатты...

Обработка SIGCHLD не потребует никиких примитивов синхронизации ( мутексов семафоров итд ) ,
всю работу сделает ядро
переклчением контекста основного кода и обработчика сигнала ( в простонародии колбеком) ...

Если ТС Unix way не нравится , пусть пишет свой арбитр нитей в соотвествии с ТЗ. ...
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266248
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovskyд0kВ тему cpp::end of use

40 секунд.....
Код: plaintext
1.
for domain in `cat resolv` ; do  nslookup $domain | egrep 'Name|Address' ; done



Это не то что требовалось.
Надо параллельно резолвить.


Не вижу проблем запустить резолвинг
в паралель
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266255
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Учитывая что DNS - достаточно быстрая услуга и имеет бесконечно большое количество зеркал (availability,
partition tolerance) - то задача по сути сводится к толщине канала. Пока сеть выдерживает - можно увеличивать
параллелизм.

Но помня природу самих DNS-записей я-бы больше делал акцент на их длительное хранение.
На самом деле только 1-й запуск этого приложения будет продуктивен. Повторные - скорее
всего будут бегать по тем-же записям. Это такое моё предположение.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266276
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonУчитывая что DNS - достаточно быстрая услуга и имеет бесконечно большое количество зеркал (availability,
partition tolerance) - то задача по сути сводится к толщине канала. Пока сеть выдерживает - можно увеличивать
параллелизм.

Но помня природу самих DNS-записей я-бы больше делал акцент на их длительное хранение.
На самом деле только 1-й запуск этого приложения будет продуктивен. Повторные - скорее
всего будут бегать по тем-же записям. Это такое моё предположение.

без админа тыкать пальцем в небо смысла малоGenerally, DNS propagation takes 24 to 48 hours to complete whenever any changes are made to the Zone File. Lowering the TTL prior to making the change will reduce the time for propagation.



У меня ощущение , что либо консерватории проекта что то с камертоном ,
либо уровень ТС не дотягивает до нужной проекту квалификации...
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266291
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Местные регистраторы гарантировали что через 24 часа доменное имя будет доступно.

Хотя ... вся эта постановка зыбкая. На консистетность забили большой болт.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266296
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonУчитывая что DNS - достаточно быстрая услуга и имеет бесконечно большое количество зеркал (availability,
partition tolerance) - то задача по сути сводится к толщине канала.


Задача сводится к настройке на Linux машине кеширующего ДНС.
с которым приложение рабоатет по 127.0.0.1
и не заморачивается с собственним внутренним кешем для резолвинга.....

Если кеширующий ДНС ранее уже не взлетел по каким либо причинам,
то вопросы который задает ТС не внушают мне оптимизма ,
что он сделает кеш лучше, чем готовый кеширующих ДНС.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266400
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0kНе вижу проблем запустить резолвинг
в паралель
Ну так и напишите за 40 секунд, а не хвалитесь однострочным хеллоуворлдом не по теме
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266493
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я-бы сказал что тут параллель как таковая не особо нужна. Тут скорее - грамотное
разбиение исходных данных на N частей (планирование). Запуск N jobs. И слияние
их результатов в логи. Практически нет concurrency.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266529
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovskyд0kНе вижу проблем запустить резолвинг
в паралель
Ну так и напишите за 40 секунд, а не хвалитесь однострочным хеллоуворлдом не по теме


2 минуты :)
Код: plaintext
1.
2.
3.
4.
5.
6.
$ cat ./resolver.sh 
 res=result.$$ ; 
 echo $res; 
  nslookup  $1   >>$res   2>&1 

$ for domain in `cat  resolv` ; do     ./resolver.sh $domain  & 2>&1   ;    done  ;   cat  result* ;   rm -f   result* ;
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266547
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В оракле есть такая очень удобная функция. Ora_hash().

Вот пример ее юзания. Выборка гео-Ip адресов будет равномерно разбита на 2 группы:

Код: plsql
1.
SELECT beginIp FROM geo WHERE ORA_HASH(beginIp,2) = 0;



Код: plsql
1.
SELECT beginIp FROM geo WHERE ORA_HASH(beginIp,2) = 1;



Одну можно передать 1-му джобу и вторую другому.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266580
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот тут на выбор аж 7 DNS провайдеров http://beebom.com/best-dns-servers/

+ у каждого целая пачка primary/secondary.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266599
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
д0k,

Код: plaintext
1.
./resolver.sh $domain &


а что будет если запустить сразу 25000 штук?
Код: plaintext
1.
cat  result*


а что будет если к этому моменту не все джобы завершатся?

Я смотрю, вы тот еще доктор, умеете удалить гланды через одно место
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266628
д0k
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovskyд0k,

Код: plaintext
1.
./resolver.sh $domain &


а что будет если запустить сразу 25000 штук?
Код: plaintext
1.
cat  result*


а что будет если к этому моменту не все джобы завершатся?

Я смотрю, вы тот еще доктор, умеете удалить гланды через одно место

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

1. можно проверить...
2. проверку на завершение нужно добавить.

После размышлений я бы по другому сделал
порезал бы файл со списком доменов на нужное количество под паралеллизм

и скормил бы файлы паралельно выполняющимся nslookup -ам
перанаправив их содержимое в stdin а stdout парсеру ...

Anatoly MoskovskyЯ смотрю, вы тот еще доктор, умеете удалить гланды через одно место

Я по всякому могу
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266692
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парни, чего вы за всякую .уйню зацепились? ТС давно пропал если чо.
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266694
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТС уронил гугловский ДНС ?
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39266725
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
свой резолвер писать ещё не предлагали?
...
Рейтинг: 0 / 0
Linux C++ потоки
    #39289522
kT_________
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как молоды мы были.. хочется вновь и вновь перечитывать книги Стивенса ;)
сорри, не стал читать всю ветку, автору можно порекомендовать потоки Буста, если конечно вы о них не знаете, либо ограничены в их использование.
...
Рейтинг: 0 / 0
69 сообщений из 69, показаны все 3 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Linux C++ потоки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]