0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 6
|
||||||
1 | ||||||
Не получается создать более 382 потоков19.04.2009, 11:52. Показов 11077. Ответов 17
Метки нет (Все метки)
нужно создать много нитей. Не хочет создавать более 382 потоков. на 383ем возвращает 12 = ENOMEM = out of memory
Проблемма: нужно создать значительно большее кол-во потоков. Вопрос: out of какой memory. RAM ещё хватает с головой. gcc-4.2.4 linux-2.6.27.8 запускал на разных машинах и разных дистрибутивах. Везде одна и та же ошибка на одном и том же потоке
0
|
19.04.2009, 11:52 | |
Ответы с готовыми решениями:
17
Более рациональный способ синхронизации потоков Нужно сделать чтобы в цикле работало не более 10-ти потоков Не получается объединить более 2 строк Ремонт Посудомойка ZANUSSI DCS-382 Stydio Line, нужна инструкция пользователя |
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
|
19.04.2009, 11:59 | 2 |
Макрос вобще-то так определяется
Код
#define THREADS 1000
0
|
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 6
|
|
19.04.2009, 12:00 [ТС] | 3 |
в оригинале его нет . перепечатывал ручками с монитора. нечайно вырвалось.
0
|
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 6
|
|
19.04.2009, 17:07 [ТС] | 5 |
безрезультатно
0
|
19.04.2009, 17:16 | 6 |
Возможно, что проблема в следующем. Поток - это по сути новый процесс, но который имеет общую глобальную память с родительским процессом, но свой собственный стек. При этом все потоки живут в одном и том же виртуальном адресном пространстве. На каждый стек intel'овский вариант линуха выделяет что-то порядка 8 мегов памяти. Помножить на 382 - это более 3 гигов. Наверняка линух у тебя 32-битный, т.е. на один процесс отводится максимум 4 гига виртуальной памяти. ОС не в состоянии полностью динамически выделать память под разные части адресного пространства - это делается более-менее статически. Т.е. начиная с какого-то адреса жёстко выделается место под mmap и динамические библиотеки, начиная с какого-то адреса жёстко выделается место под стеки и т.п. Но вот таким количеством потоков скорее всего исчерпался выделенны лимит адресного пространства под стеки.
Решений вижу два: 1. Установить 64-битную версию линуха 2. Перекомпилять ядро, поменяв в настройках ограничение на стек одного процесса. Последствия, думаю, сам понимаешь - для всех остальныз процессов ты порежешь пользовательский стек. Какие-то большие программы с глубоким стеком вызова в теории начнут ломаться на исполнении
1
|
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 6
|
|
19.04.2009, 18:59 [ТС] | 7 |
очень даже вариант. Насколько я знаю в посиксовых нитях при их создании можно задавать длину стека самостоятельно. Так что скорее всего ядро дёргать не придётся. Буду пробывать.
0
|
19.04.2009, 19:24 | 8 |
Это видимо дёргать напрямую системный вызов clone (или clone2, если таковой на i386 присутсвует). Правда через клоны чем плохо, что самому надо следить за этими тредами (а так это делает менеджер внутри библиотеки libpthread). Хотя в современных линуксах вместо libpthread уже используется nptl, возможно, что там возможностей для настройки больше
0
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
|
20.04.2009, 00:54 | 9 |
prestigio, 12 = ENOMEM = out of memory, память проверил ?
Сообщение от prestigio
а один поток запускал на них ? Добавлено через 59 секунд Код
[guest@station ~]$ uname -a Linux station.domain 2.6.23.1-42.fc8 #1 SMP Tue Oct 30 13:55:12 EDT 2007 i686 athlon i386 GNU/Linux [guest@station ~]$
0
|
0 / 0 / 0
Регистрация: 19.04.2009
Сообщений: 6
|
|
20.04.2009, 16:11 [ТС] | 10 |
запускал всё на (хотя это особо не важно) :
Linux slax 2.6.27.8 #1 SMP Sun Dec 7 08:30:31 Local time zone must be set--see zic m i686 Intel(R) Celeron(R) M CPU 440 @ 1.86GHz GenuineIntel GNU/Linux Linux debian 2.6.18-6-486 #1 Sun Feb 10 22:06:33 UTC 2008 i686 GNU/Linux Linux slax 2.6.27.8 #1 SMP Sun Dec 7 08:30:31 Local time zone must be set--see zic m i686 AMD Duron(tm) processor AuthenticAMD GNU/Linux >>Это видимо дёргать напрямую системный вызов clone оказалось всё намного проще. можно просто pthread_attr_setstacksize(); обрубал размер стека по корень. загнулся на 52'587 тредах с сообщением "killed". Скорее всего некая защита от своего рода мусорных бомб. Треды то непрерывно в цикле шпарю. В общем и целом ляпота. Работает.
0
|
0 / 0 / 0
Регистрация: 02.09.2009
Сообщений: 12
|
|
11.09.2009, 14:29 | 12 |
А сколько нужно в pthread_attr_setstacksize(); указать? Какой размер стека?
Добавлено через 12 минут Глупый вопрос. Уже понял.
0
|
3 / 3 / 0
Регистрация: 09.01.2009
Сообщений: 41
|
|||||||||||||||||||||
02.10.2009, 05:25 | 13 | ||||||||||||||||||||
CONFIG_4KSTACKS на х86_32
Добавлено через 25 минут Ах да, самое интересное
Шайтай деатачед версия. делать ulimit -s 100 обязательно
Около 31.000 запустилось :-P
0
|
garryTheHotDog
|
|
05.03.2010, 22:55 | 14 |
а как вычислить необходимы размер стека для потока?? или только опытным путем?
|
garryTheHotDog
|
|
06.03.2010, 11:16 | 16 |
А если я хочу его уменьшить...работает очень много потоков...по умолчанию слишком велик!
|
06.03.2010, 11:30 | 17 |
Можно и математическим путём. Прикидываешь, сколько места в стеке будет отжирать каждая процедура и какие будут процедуры. Если не представляешь, как это делается, то только опытным путём
0
|
06.03.2010, 15:30 | 18 |
это говорит только о неправильной проектировке/структуре проекта!
есть такой термин как "пул потоков"(thread pool), почитайте. вот скажите, для чего столько потоков?
0
|
06.03.2010, 15:30 | |
06.03.2010, 15:30 | |
Помогаю со студенческими работами здесь
18
Не получается выставить более 60 Герц на мониторе Создать пул потоков Не получается принять TCP/IP пакет более 2048 байт. Visual C++. Как создать много потоков? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |