242 / 120 / 14
Регистрация: 15.10.2010
Сообщений: 395
|
|
1 | |
Сколько потоков можно создать?30.04.2011, 07:24. Показов 5709. Ответов 7
Метки нет (Все метки)
Работаю над задачей "производитель - потребитель". Задание синхронизировать потоки. Всё вроде сделал и получилось. При небольшом количестве потоков работает отлично. Но когда хочу создать около 100 потоков(ну около 100 производителей и 100 потребителей), синхронизация не работает. Может есть какое то ограничение на создание потоков в рамках одного процесса?
0
|
30.04.2011, 07:24 | |
Ответы с готовыми решениями:
7
Замерить сколько потоков завершится, запуская их случайным образом Область видимости общей переменной для потоков + закрытие потоков Сколько можно создать потоков исходя из количества процессоров и объема оперативной памяти? О потоках std::thread: можно ли вложить потоки друг в друга и можно ли создать динамический массив потоков? |
30.04.2011, 11:51 | 2 |
Вообще говорят о 2000. Связано это с тем, что по умолчанию на каждый поток резервируется 1МБ под стек. Что в итоге дает около 2 ГБ, которыми ограничивается размер доступной памяти из user-mode приложений в 32-разрядных системах (опять же по умолчанию).
1
|
242 / 120 / 14
Регистрация: 15.10.2010
Сообщений: 395
|
||||||
30.04.2011, 12:47 [ТС] | 3 | |||||
Может я чего то не правильно сделал? Хотя при малом количестве потоков всё работает.
Я решил эту задачу с помощью трёх семафоров. Описание их есть в комментариях программы. Посмотрите, может что не так? А то голову уже сломал.О_о
0
|
1487 / 1414 / 240
Регистрация: 19.02.2010
Сообщений: 3,915
|
|
07.05.2011, 23:52 | 4 |
RUSya82 при росте числа потоков может число дескрипторов в системе превысить некоторый порог. На каждый объект ядра (кроме, вроде бы, критической секции? не помню, что там у Рихтера было написано) заводится дескриптор, плюс на каждый поток, который что-то выводит на экран, тоже заводится один или два дескриптора (при выводе через функции gdi дескрипторы точно заводятся, может быть, и при выводе на консоль тоже такая бяка происходит).
Ну и надо с помощью диспетчера задач (при том числе потоков в проге, когда прога ещё не разваливается) посмотреть - не растёт ли при работе проги со временем число потоков и число дескрипторов. Это для гарантии, что закрываете-удаляете все ранее инициализированные объекты ядра. Ну а четко ограничения могут быть обозначены-описаны либо в МСДН, либо в книге Рихтера, либо у Руссиновича-Соломона (в книге про потроха Винды). Всё это есть в электронном виде.
1
|
Brainsbreaker
899 / 374 / 54
Регистрация: 01.02.2011
Сообщений: 1,608
|
|
08.05.2011, 19:08 | 5 |
Руссинович-Соломон, да, хорошая книга, про потроха... )
0
|
242 / 120 / 14
Регистрация: 15.10.2010
Сообщений: 395
|
|
12.05.2011, 07:26 [ТС] | 6 |
Насколько я помню, на каждый объект ядра заводится дескриптор, просто критическая секция таковым не является.
0
|
111 / 112 / 18
Регистрация: 11.03.2011
Сообщений: 421
|
|
13.05.2011, 00:04 | 7 |
тоже читал где-то о предельно допустимом количестве дескрипторов в системе.
собственно, практиковал создавать указанное пользователем количество потоков для параллельной обработки. пробовал 90 потоков одновременно запускать. у системы инфаркт чуть не случился =) по поводу семафоров: на мсдн-е (в документации) написана рекомендация семафоры не использовать, а заменить их ивентами, при чем обрабатывать состояния вручную. и как на счет посмотреть в дэбаге возвращаемые значения? или загнать всё в try {} блоки и проверять все возвращаемые значения, в качестве кидаемого значения, например, счетчик цикла с минусом вписать, а в catch {} еще и код ошибки куда-нибудь записывать. код ошибки через GetLastError() можно посмотреть.
1
|
242 / 120 / 14
Регистрация: 15.10.2010
Сообщений: 395
|
|
15.05.2011, 12:52 [ТС] | 8 |
Просто я не представляю, как в данном случае контролировать переполнение и опустошение буфера с помощью событий? А если ёмкость буфера не 2, а 20? Для этого как раз и есть специально обученный зверь - семафор, у которого имеется счетчик числа ресурсов.
0
|
15.05.2011, 12:52 | |
15.05.2011, 12:52 | |
Помогаю со студенческими работами здесь
8
Как определять, сколько максимально потоков можно запускать? Создать столько же потоков, сколько строк в List Можно ли создать на одном сокете одновременно много потоков Сколько маркеров можно создать на карте Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |