0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 67
|
||||||
1 | ||||||
ThreadPool - не все потоки учитываются при использовании в цикле26.12.2015, 18:00. Показов 3072. Ответов 29
При выполнении ThreadPool в цикле, после определённого количества циклов он зависает на строке 17(Monitor.Wait(workerLocker).
Точнее зависания как такового нет, он просто ждёт workerLocker, но не получает его. При этом runningWorkers = 1 (или2), где runningWorkers косвенно указывает на количество работающих потоков, которые должны бы были освободить workerLocker, но судя по всему они как то пропадают Подскажите пожалуйста более надёжный способ выяснить, есть ли рабочие потоки в ThreadPool (и их количество), или, как решить вопрос с "пропадающими потоками" при использовании в цикле.
0
|
26.12.2015, 18:00 | |
Ответы с готовыми решениями:
29
Как в ThreadPool проверить, что все потоки завершены Необходимо синхронизировать потоки (написать свой ThreadPool) Потоки, мультипоточность Task or Async/Await or ThreadPool? Определение индекса массива в цикле при использовании указателей |
0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 67
|
||||||
30.12.2015, 12:40 [ТС] | 21 | |||||
OwenGlendower, да, в чистом виде при малом объёме вычислений внутри потока CountdownEvent действительно быстрее. Но в случае если вычислений внутри потока много (как у меня) - то его влияние незначительно...
Но в любом случае он лучше того lock`a который я использовал. Psilon, спасибо. Похоже, ваш код самый быстрый. Но я не могу до конца разобраться с Partitioner. В случае когда мой поток принимает 1 значение при использовании:
А как в случае использования Partitioner получить элемент массива или хотя бы его индекс?
0
|
Master of Orion
|
|||||||||||
30.12.2015, 13:25 | 22 | ||||||||||
Сообщение было отмечено Andreys5 как решение
Решение
Andreys5, ну в моем примере выше просто
Добавлено через 5 минут
0
|
aquaMakc
|
30.12.2015, 15:27
#23
|
0
|
Storm23
|
30.12.2015, 15:44
#24
|
Не по теме: Неа, как раз не рекомендуется лочить объекты данных. По правильному - нужно лочить именно отдельно созданный объект. Более того, стандартные коллекции(List<>, Dictionary<> и т.д.) предоставляют уже готовый объект для этого. А интерфейс ICollection требует что бы вы создали такой объект. Не важно используемый он или нет. Важно что его пытаются захватить несколько потоков и он выполняет роль семафора.
0
|
aquaMakc
|
30.12.2015, 15:50
#25
|
0
|
Storm23
|
30.12.2015, 16:30
#26
|
0
|
484 / 397 / 68
Регистрация: 14.02.2014
Сообщений: 1,930
|
|
30.12.2015, 16:40 | 27 |
Storm23, оффтопные посты не позволяют ставить "спасибо", так-то благодарю словами
Есть у меня определённая проблема с доступом к List из большого количества потоков. С SyncRoot стало лучше, но нет-нет, да наблюдаю
0
|
Master of Orion
|
||||||
30.12.2015, 16:46 | 28 | |||||
aquaMakc,
1) лочить нужно неиспользуемую переменную, как уже сказали выше 2) лично я избегаю lock-ов на публичные переменные, потому что вызывающий код уже мог сделать лок на Array.SyncRoot к примеру, и в таком случае я свалюсь в дедлок. Локальная переменная гарантирует то, что её лочить могу только я, и за счёт этого не будет блокировки потоков из-за кода типа
3
|
0 / 0 / 0
Регистрация: 05.10.2014
Сообщений: 67
|
|
30.12.2015, 17:56 [ТС] | 29 |
Psilon, спасибо, всё работает.
Но после отработки цикла почти вся оперативная память остаётся забитой непонятно чем (массив для расчётов - пуст, результат - всего 1 значение).(такое ощущение что он хранит в памяти все отработанные потоки) Не подскажите, как с этим бороться?
0
|
Master of Orion
|
|
30.12.2015, 20:09 | 30 |
Andreys5, ну, тут обычно лучше запустить профилировщик и посмотреть, что память занимает. Так-то я сказать не могу Возможно память будет очищена по первому требованию системы (то есть объекты уже умерли, но их еще не собрал сборщик), а возможно где-то висячие ссылки остаются... Это уже нужно разбираться.
0
|
30.12.2015, 20:09 | |
30.12.2015, 20:09 | |
Помогаю со студенческими работами здесь
30
Рандомные числа выдают один и тот же результат при их использовании в цикле При сортировке не учитываются отрицательные элементы При компиляции не учитываются изменения, внесенные в проект ссылки с rel=nofollow учитываются при подсчете тиц? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |