|
19 / 11 / 0
Регистрация: 02.09.2010
Сообщений: 235
|
||
Многопоточные библиотеки02.09.2010, 18:18. Показов 9681. Ответов 13
Метки нет (Все метки)
Всем добрый вечер!
Разрабатываю приложение, которое в конечном итоге должно работать в несколько потоков, и не понимаю как реализовать. Библиотек для многопоточности много:
Всего строк около 5000 -> 5000 и потоков. Никакой синхронизации не нужно, каждый поток там выполняет свою задачу и вконце складывать вычисления всех потоков не нужно. Как функция в каком-то потоке завершается, поток должен сам удалиться. Т.е. по сути мне нужна просто возможность создавать потоки, удалять потоки и проверять их наличие по одному из параметров строки (если вдруг понадобится запустить функцию с новыми параметрами, чтобы сперва определить что такая уже не обрабатывается). И надо чтобы работало как на Windows, так и на Lunix Всем спасибо за любые комментарии, советы и подсказки
0
|
||
| 02.09.2010, 18:18 | |
|
Ответы с готовыми решениями:
13
Многопоточные консольные приложения Будут ли мои многопоточные решения кроссплатформенными? |
|
19 / 11 / 0
Регистрация: 02.09.2010
Сообщений: 235
|
|
| 04.09.2010, 21:05 [ТС] | |
|
Забыл написать, пишу в окнах, VS 2010
Уже нашел что вроде как OpenMP не обладает достаточным для моей задачи функционалом, а Pthreads требует слишком много ресурсов для одного потока и вроде как 5 тыс на стандартном компе не потянет... #include < thread > это получается Intel Threading Building Blocks? Посоветуйте что-нибудь
0
|
|
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
||
| 04.09.2010, 21:23 | ||
|
В boost есть библиотека threads (которая фактически и войдет в новый стандарт), посмотрите в ее сторону, сам я с ней дела не имел.
0
|
||
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
|
|
| 04.09.2010, 21:24 | |
|
Damaks, вот это http://msdn.microsoft.com/ru-ru/library/ms684841 читали?
0
|
|
|
19 / 11 / 0
Регистрация: 02.09.2010
Сообщений: 235
|
|
| 04.09.2010, 22:40 [ТС] | |
|
Damaks, прочитал, но ответ на свой вопрос не нашел (
Мне всего лишь нужно понять какая библиотека или способ реализации подходит под мою программу CyBOSSeR а она по нагрузке и функциональности подойдет, как вы думаете?
0
|
|
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
|
| 04.09.2010, 23:16 | |
|
0
|
|
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
|
|||
| 04.09.2010, 23:25 | |||
|
Может быть какие-то из сторонних библиотек и лучше, чем родные мелкомягкие, но это нужно самому методично все их пробовать использовать под свою задачу и оценивать, что лучше, что хуже. Я думаю, есть смысл использовать "родную" и для компилятора и для ОС библиотеку, а уж если с ней ничего не выйдет - пытаться сторонние прикручивать. Что же до задачи Вашей, то количество потоков всегда ограничено, какими бы средствами Вы их не создавали. К примеру там же в описании функции CreateThread про количество потоков вот, что написано:
1
|
|||
|
19 / 11 / 0
Регистрация: 02.09.2010
Сообщений: 235
|
|
| 05.09.2010, 14:24 [ТС] | |
|
А то есть вот я посмотрел у меня максимальный поток будет держать массив где-то в 30-40 мегабайт, а минимальный где-то 0.1 мегабайт. Получается я могу изменить изначальный размер стека до 0 и дальше он увеличится по мере надобности, или же надо сразу задавать максимальное значение? Потому что там получается такое распределение что 4 тыс потоков -массив меньше 1 мегабайта и 1 тыс - там больше и рост с каждым потоком увеличивается экспоненциально.
Сейчас читаю разные форумы.. и постепенно прихожу к выводу что OpenMP намного быстрее всех других. Читал про неё, там создаешь потоки и потом в цикле for начинаешь их выполнять...но нигде не написано как удалить/запустить/проверить на существование конкретный поток. Может вы знаете как это сделать? CyBOSSeR спасибо, попробую, отпишусь
0
|
|
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
||
| 05.09.2010, 15:52 | ||
|
Damaks, я думаю, что 5000 потоков это много, слишком много. Только на их создание уйдет очень много времени и ресурсов, возможно однопоточное приложение даже будет быстрее.
Вы уверены, что 5000 потоков, это то что Вам нужно? На сколько функция обработки строки является трудоемкой по времени? Если приведете код функции, будет гораздо легче понять, что подойдет лучше.
0
|
||
|
19 / 11 / 0
Регистрация: 02.09.2010
Сообщений: 235
|
||
| 05.09.2010, 22:59 [ТС] | ||
|
Однопоточное приложение - для меня это наверно будет сложно
![]() Функция - это клиент. Он присоединяется к серверу и собирает события в массивы. При обработке самого активного сервера у меня получилось функция грузит процесср P4 на ~ 6% Активность остальных серверов резко снижается. Наверно в посленей тысяче события происходят вообще с частотой одно в 10-30 секунд...т.е. там нагрузка стремится к полному нулю. А если мне писать в один поток, это значит нужно как-то собрать массив соединений с серверами и каждое поочереди считывать и обрабатывать. И потом в цикле снова и снова перебирать каждое соединение. Я даже не знаю как это правильно сделать там же у каждого сервера свои массвы и свои переменные, и так внутри потока они получаются локальными, а при таком раскладе они вроде как глобальные...т.е. это всё нужно как-то переключать постоянно.Поэтому я и начал искать способы реализации многопоточности. Пару дней назад наткнулся на сообщение на каком-то форуме что в библиотеке OpenMP вообще потоки создаются очень быстро без всякой нагрузки... и типо париться по этому поводу не нужно ![]()
0
|
||
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
|
||||||||
| 05.09.2010, 23:21 | ||||||||
Правда, в limits.h по этому поводу вот, что написано:
0
|
||||||||
|
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
|
||||
| 06.09.2010, 13:06 | ||||
|
На обычной 32 разрядной машине Вы не запустите 5000 потоков. Сегодня для проверки попробовал запустить такое количество потоков на 32 разрядной машине. Каждый поток просто ждал освобождение объекта "событие". В итоге при создании 2027 потока, программа героичеки упала, чего и следовало ожидать.
0
|
||||
|
Модератор
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
|
|
| 06.09.2010, 14:32 | |
|
Вообще, на сколько я задачу понял, как-то ненавязчиво неблокируемый ввод/вывод напрашивается. В *NIX как-раз на такие случаи есть функция epoll(). Все 6К серверов одновременно вещать вряд ли будут, а вот следить за всеми соединениями и обрабатывать те из них, на которые данные приходят - для epoll() задача. Вот обработку самих данных можно и в потоках устроить, но всё равно нужно будет следить за количеством одновременно обрабатываемых соединений.
2
|
|
|
19 / 11 / 0
Регистрация: 02.09.2010
Сообщений: 235
|
|
| 07.09.2010, 00:58 [ТС] | |
|
Я придумал как снизить кол-во потоков до 1 тыс... но в любом случае получается что память будет расходоваться... просто ужасно
![]() Это вот у меня первый сервер сейчас требует 43 мегабайта, второй 36, потом 33, 32.... и так до 150-ого. После 150 и до 1000-ого серверы уже требуют меньше 5 мегабайт. Т.е. несложно посчитать сколько памяти будет зарезервировано и не будет использовано ... хотя чё там, если на каждый сервер резервировать по 43 мега - ниодного сервера не хватит на тысячу... А в дальнейшем самый активный сервер будет всё больше и больше требовать...думаю вплоть до 100 мегабайт. Можно тогда вопрос, у однопоточного приложения получается тоже есть стек и его размер ограничен? Простая, однопоточная игра вроде как при запуске в меню допустим берет 100 мегабайт. Потом я запускаю допустим какой-то уровень и раз, уже 500 мегабайт. Т.е. получается сразу 500 мегабайт то не резервируется. Почему тогда под поток нужно резервировать? easybudda спасибо, почитаю про epoll(), но мне сейчас нужно чтобы на винде работало... И всётаки реализация в один поток для меня сложна. Я не представляю как мне сделать раздерелине массивов и переменных для каждого сервера... ну всмысле указать что если сервер тако - то записывать в такой массив/перепенную, если другой - то в другую. И соответственно надо как-то создавать переменные/массивы с разными именами - и всё это тогда получается глобальное, в то время как для многопоточного приложения для каждого сервера его переменные локальны. Добавлено через 9 часов 3 минуты А что с fork(), у него всё аналогично с памятью получается? Вроде забыл добавить что все потоки будут создаваться при запуске приложения, последовательно считываться из текстовика. А после больше добавляться/удаляться не будут, за исключением редких случаев, если вручную надо будет добавить.
0
|
|
| 07.09.2010, 00:58 | |
|
Помогаю со студенческими работами здесь
14
Многопоточные программы, распараллеливание при чтении файла
Как включить библиотеки в исполняемый файл, чтобы не приходилось ставить библиотеки (Eclipse) Вызов функции одной динамической библиотеки из другой динамической библиотеки Многопоточные приложения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога
Финальные проекты на Си и на C++:
hello-sdl3-c. zip
hello-sdl3-cpp. zip
Результат:
|
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога
MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
|
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд.
Даже если у вас. . .
|
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает
монорепозиторий в котором находятся все исходники.
При создании нового решения, мы просто добавляем нужные проекты
и имеем. . .
|
|
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение:
В этой книге («Подход, основанный на вариантах использования») Ивар утверждает,
что архитектура программного обеспечения — это
структуры,. . .
|
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога
Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
|
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip
На первой гифке отладочные линии отключены, а на второй включены:. . .
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем.
. . .
|