Форум программистов, компьютерный форум CyberForum.ru

Многопоточные библиотеки - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.84
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
02.09.2010, 18:18     Многопоточные библиотеки #1
Всем добрый вечер!
Разрабатываю приложение, которое в конечном итоге должно работать в несколько потоков, и не понимаю как реализовать.
Библиотек для многопоточности много:
1. Набор библиотек Boost
2. OpenMP
3. OpenThreads
4. POCO Thread
5. Zthread
6. Pthreads (Ptreads-w32)
7. Qt4 Threads
8. Intel Threading Building Blocks
9. Потом ещё находил примеры с использованием <thread>, который вообще непонятно откуда брать. Есть только примеры с его использованием...
10. Также нашел ещё функцию _beginthread, и также про неё ничего не понятно.
...
А задача у меня такова, нужно чтобы приложение загружало список, в котором каждая строка - набор параметров. А далее поочередно запускало определенную void функцию с параметрами из каждой строки в новом потоке.
Всего строк около 5000 -> 5000 и потоков.
Никакой синхронизации не нужно, каждый поток там выполняет свою задачу и вконце складывать вычисления всех потоков не нужно. Как функция в каком-то потоке завершается, поток должен сам удалиться.

Т.е. по сути мне нужна просто возможность создавать потоки, удалять потоки и проверять их наличие по одному из параметров строки (если вдруг понадобится запустить функцию с новыми параметрами, чтобы сперва определить что такая уже не обрабатывается).
И надо чтобы работало как на Windows, так и на Lunix
Всем спасибо за любые комментарии, советы и подсказки
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.09.2010, 18:18     Многопоточные библиотеки
Посмотрите здесь:

C++ Библиотеки
Библиотеки C++
C++ Библиотеки??
C++ Библиотеки (C++)
Библиотеки C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
04.09.2010, 21:05  [ТС]     Многопоточные библиотеки #2
Забыл написать, пишу в окнах, VS 2010

Уже нашел что вроде как OpenMP не обладает достаточным для моей задачи функционалом, а Pthreads требует слишком много ресурсов для одного потока и вроде как 5 тыс на стандартном компе не потянет...
#include < thread > это получается Intel Threading Building Blocks?
Посоветуйте что-нибудь
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2010, 21:23     Многопоточные библиотеки #3
Цитата Сообщение от Damaks Посмотреть сообщение
#include < thread > это получается Intel Threading Building Blocks?
Нет, это одно из нововведений будущего стандарта C++0x, который MSVS 2010 частично поддерживает.
В boost есть библиотека threads (которая фактически и войдет в новый стандарт), посмотрите в ее сторону, сам я с ней дела не имел.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
04.09.2010, 21:24     Многопоточные библиотеки #4
Damaks, вот это http://msdn.microsoft.com/ru-ru/library/ms684841 читали?
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
04.09.2010, 22:40  [ТС]     Многопоточные библиотеки #5
Damaks, прочитал, но ответ на свой вопрос не нашел (
Мне всего лишь нужно понять какая библиотека или способ реализации подходит под мою программу
CyBOSSeR а она по нагрузке и функциональности подойдет, как вы думаете?
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.09.2010, 23:16     Многопоточные библиотеки #6
Цитата Сообщение от Damaks Посмотреть сообщение
CyBOSSeR а она по нагрузке и функциональности подойдет, как вы думаете?
Сюдя по тому, что данная библиотека войдет в стандарт - да.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
04.09.2010, 23:25     Многопоточные библиотеки #7
Цитата Сообщение от Damaks Посмотреть сообщение
прочитал, но ответ на свой вопрос не нашел
Как это? Там же вот про многопоточность. Пример даже есть... http://msdn.microsoft.com/ru-ru/library/ms682516
Может быть какие-то из сторонних библиотек и лучше, чем родные мелкомягкие, но это нужно самому методично все их пробовать использовать под свою задачу и оценивать, что лучше, что хуже. Я думаю, есть смысл использовать "родную" и для компилятора и для ОС библиотеку, а уж если с ней ничего не выйдет - пытаться сторонние прикручивать.
Что же до задачи Вашей, то количество потоков всегда ограничено, какими бы средствами Вы их не создавали. К примеру там же в описании функции CreateThread про количество потоков вот, что написано:
The number of threads a process can create is limited by the available virtual memory. By default, every thread has one megabyte of stack space. Therefore, you can create at most 2,048 threads. If you reduce the default stack size, you can create more threads...
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
05.09.2010, 14:24  [ТС]     Многопоточные библиотеки #8
А то есть вот я посмотрел у меня максимальный поток будет держать массив где-то в 30-40 мегабайт, а минимальный где-то 0.1 мегабайт. Получается я могу изменить изначальный размер стека до 0 и дальше он увеличится по мере надобности, или же надо сразу задавать максимальное значение? Потому что там получается такое распределение что 4 тыс потоков -массив меньше 1 мегабайта и 1 тыс - там больше и рост с каждым потоком увеличивается экспоненциально.

Сейчас читаю разные форумы.. и постепенно прихожу к выводу что OpenMP намного быстрее всех других. Читал про неё, там создаешь потоки и потом в цикле for начинаешь их выполнять...но нигде не написано как удалить/запустить/проверить на существование конкретный поток. Может вы знаете как это сделать?

CyBOSSeR спасибо, попробую, отпишусь
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
05.09.2010, 15:52     Многопоточные библиотеки #9
Damaks, я думаю, что 5000 потоков это много, слишком много. Только на их создание уйдет очень много времени и ресурсов, возможно однопоточное приложение даже будет быстрее.
Вы уверены, что 5000 потоков, это то что Вам нужно?
На сколько функция обработки строки является трудоемкой по времени?
Если приведете код функции, будет гораздо легче понять, что подойдет лучше.
Цитата Сообщение от Damaks Посмотреть сообщение
Получается я могу изменить изначальный размер стека до 0 и дальше он увеличится по мере надобности, или же надо сразу задавать максимальное значение?
Сразу. Размер стека величина константная.
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
05.09.2010, 22:59  [ТС]     Многопоточные библиотеки #10
Однопоточное приложение - для меня это наверно будет сложно
Функция - это клиент. Он присоединяется к серверу и собирает события в массивы.
При обработке самого активного сервера у меня получилось функция грузит процесср P4 на ~ 6%
Активность остальных серверов резко снижается. Наверно в посленей тысяче события происходят вообще с частотой одно в 10-30 секунд...т.е. там нагрузка стремится к полному нулю.

А если мне писать в один поток, это значит нужно как-то собрать массив соединений с серверами и каждое поочереди считывать и обрабатывать. И потом в цикле снова и снова перебирать каждое соединение. Я даже не знаю как это правильно сделать там же у каждого сервера свои массвы и свои переменные, и так внутри потока они получаются локальными, а при таком раскладе они вроде как глобальные...т.е. это всё нужно как-то переключать постоянно.

Поэтому я и начал искать способы реализации многопоточности. Пару дней назад наткнулся на сообщение на каком-то форуме что в библиотеке OpenMP вообще потоки создаются очень быстро без всякой нагрузки... и типо париться по этому поводу не нужно

Сразу. Размер стека величина константная.
т.е. как массив в потоке достигнет размера стека - будет ошибка? Нигде в описании Pthreads просто не видел предупреждений...
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
05.09.2010, 23:21     Многопоточные библиотеки #11
Цитата Сообщение от Damaks Посмотреть сообщение
Нигде в описании Pthreads просто не видел предупреждений...
ERRORS
The pthread_create() function will fail if:

[EAGAIN] The system lacked the necessary resources to create
another thread, or the system-imposed limit on the
total number of threads in a process
[PTHREAD_THREADS_MAX] would be exceeded.
...
man pthread_create
Правда, в limits.h по этому поводу вот, что написано:
C
1
2
3
4
5
6
...
/* Maximum number of threads that can be created per process. */
/* Windows allows any arbitrary number of threads per process. */
#undef PTHREAD_THREADS_MAX
/* #define PTHREAD_THREADS_MAX unspecified */
...
виндавс рулит!
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
06.09.2010, 13:06     Многопоточные библиотеки #12
Цитата Сообщение от Damaks Посмотреть сообщение
.е. как массив в потоке достигнет размера стека - будет ошибка?
Имеено, приложение просто упадет.
Цитата Сообщение от Damaks Посмотреть сообщение
OpenMP вообще потоки создаются очень быстро без всякой нагрузки
Цитата Сообщение от Damaks Посмотреть сообщение
Нигде в описании Pthreads просто не видел предупреждений
Все библиотеки так или иначе пользуются функциями ОС для создания потоков.
На обычной 32 разрядной машине Вы не запустите 5000 потоков.
Сегодня для проверки попробовал запустить такое количество потоков на 32 разрядной машине. Каждый поток просто ждал освобождение объекта "событие". В итоге при создании 2027 потока, программа героичеки упала, чего и следовало ожидать.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
06.09.2010, 14:32     Многопоточные библиотеки #13
Вообще, на сколько я задачу понял, как-то ненавязчиво неблокируемый ввод/вывод напрашивается. В *NIX как-раз на такие случаи есть функция epoll(). Все 6К серверов одновременно вещать вряд ли будут, а вот следить за всеми соединениями и обрабатывать те из них, на которые данные приходят - для epoll() задача. Вот обработку самих данных можно и в потоках устроить, но всё равно нужно будет следить за количеством одновременно обрабатываемых соединений.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2010, 00:58     Многопоточные библиотеки
Еще ссылки по теме:

C++ Библиотеки Си
про библиотеки в VS C++ (какие библиотеки нужны для функций 'cout' и 'cin') C++
Вызов функции одной динамической библиотеки из другой динамической библиотеки C++

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

Или воспользуйтесь поиском по форуму:
Damaks
18 / 10 / 1
Регистрация: 02.09.2010
Сообщений: 235
07.09.2010, 00:58  [ТС]     Многопоточные библиотеки #14
Я придумал как снизить кол-во потоков до 1 тыс... но в любом случае получается что память будет расходоваться... просто ужасно
Это вот у меня первый сервер сейчас требует 43 мегабайта, второй 36, потом 33, 32.... и так до 150-ого.
После 150 и до 1000-ого серверы уже требуют меньше 5 мегабайт.
Т.е. несложно посчитать сколько памяти будет зарезервировано и не будет использовано ... хотя чё там, если на каждый сервер резервировать по 43 мега - ниодного сервера не хватит на тысячу...
А в дальнейшем самый активный сервер будет всё больше и больше требовать...думаю вплоть до 100 мегабайт.

Можно тогда вопрос, у однопоточного приложения получается тоже есть стек и его размер ограничен? Простая, однопоточная игра вроде как при запуске в меню допустим берет 100 мегабайт. Потом я запускаю допустим какой-то уровень и раз, уже 500 мегабайт. Т.е. получается сразу 500 мегабайт то не резервируется. Почему тогда под поток нужно резервировать?

easybudda спасибо, почитаю про epoll(), но мне сейчас нужно чтобы на винде работало...
И всётаки реализация в один поток для меня сложна. Я не представляю как мне сделать раздерелине массивов и переменных для каждого сервера... ну всмысле указать что если сервер тако - то записывать в такой массив/перепенную, если другой - то в другую. И соответственно надо как-то создавать переменные/массивы с разными именами - и всё это тогда получается глобальное, в то время как для многопоточного приложения для каждого сервера его переменные локальны.

Добавлено через 9 часов 3 минуты
А что с fork(), у него всё аналогично с памятью получается?
Вроде забыл добавить что все потоки будут создаваться при запуске приложения, последовательно считываться из текстовика. А после больше добавляться/удаляться не будут, за исключением редких случаев, если вручную надо будет добавить.
Yandex
Объявления
07.09.2010, 00:58     Многопоточные библиотеки
Ответ Создать тему
Опции темы

Текущее время: 17:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru