Как получить вторую Систему. Поток. ThreadPool?

Если я использую ThreadPool вложенным способом, мое приложение зависает:

 ThreadPool.QueueUserWorkItem((state) =>
      ThreadPool.QueueUserWorkItem(Action));

Как заставить второй и независимый ThreadPool достигать вложения?

5
задан Jader Dias 5 February 2010 в 20:06
поделиться

4 ответа

Есть только один ThreadPool - это не то, что вы можете (или должны) сделать более одного экземпляра в приложении.

Я не рекомендую делать это, но если вы действительно хотите, вы можете использовать несколько экземпляров вашей собственной реализации ThreadPool, таких как SmartThreadPool. Это, технически, позволит использовать отдельные "пулы потоков".

Однако я подозреваю, что вы зависаете из-за тупика , а не из-за использования ThreadPool. Я бы исследовал, где вы висите. Визуализатор параллельной валюты VS2010 очень хорош для этого, если у вас установлена копия VS 2010 beta.

6
ответ дан 13 December 2019 в 05:34
поделиться

Вы используете неправильные инструменты.

В .NET 4.0 они представили библиотеку параллельных задач. Это позволяет вам делать такие вещи, как использование нескольких пулов thead, а также устанавливать родительско-дочерние отношения между рабочими элементами.

Начните с класса Task, который заменяет ThreadPool.QueueUserWorkItem.

http://msdn.microsoft.com/en-us/library/system.threading.tasks.task (VS.100) .aspx

ИЗМЕНИТЬ

Пример создания собственного пула потоков с помощью Задачи и Диспетчер задач.

http://msdn.microsoft.com/en-us/library/dd997413 (VS.100) .aspx

2
ответ дан 13 December 2019 в 05:34
поделиться

Высота дерева - это длина самого длинного пути к терминальному узлу в любом из его дочерних узлов.

Википедия говорит, что высота пустого дерева равна -1 . Я не согласен. Пустое дерево - это буквально просто дерево, содержащее один терминальный узел (нулевое или специальное значение, представляющее пустое дерево). Поскольку узел не имеет дочерних элементов, длина самого длинного пути должна быть пустой суммой = 0, а не -1.

Аналогично, непустое дерево имеет два дочерних элемента, поэтому по определению существует по крайней мере путь > = 1 к терминальному узлу.

Мы можем определить наше дерево следующим образом:

type 'a tree =
    | Node of 'a tree * 'a * 'a tree
    | Nil

let rec height = function
    | Node(left, x, right) -> 1 + max (height left) (height right)
    | Nil -> 0
-121--2320266-

В духе бонусных ответов, вот некоторые из моих собственных:

Позвольте A = (1:5) '

  1. Использование индексов [быстрее, чем repmat]:

     B = A (:, one (5,1)
    
  2. Использование матричного внешнего продукта:

     B = A * единиц (1,5)
    
  3. Использование bsxfun () [не лучший способ выполнения]

     B = bsxfun (@ plus, A, нули (1,5))
    % # или
    B = bsxfun (@ times, A, единицы (1,5))
    
-121--4605278-

Существует один и только один блок потоков.

0
ответ дан 13 December 2019 в 05:34
поделиться

Вероятно, ваше приложение зависает, потому что вы заполняете его до такой степени, что все активные потоки ждут очереди потоков. (Я предполагаю, что исходный поток ожидает завершения рабочего элемента (элементов), который он поставил в очередь)

ThreadPool по умолчанию имеет 25 * (количество CPU) рабочих потоков (IIRC).

Вероятно, вам нужно изменить способ постановки элементов в очередь. Если вы ставите их в очередь, а затем завершаете и выходите из потока, то все в порядке, но если рабочие элементы висят в ожидании других процессов, то это, как правило, плохой дизайн; если вы делаете именно это, то вам, вероятно, нужно использовать реальные потоки или совершенно другой дизайн. Использование реальных потоков, вероятно, такая же плохая идея, потому что все, что это сделает (основываясь на том, что я могу предположить о вашем использовании), вы просто создадите большое количество потоков, что не принесет ничего хорошего для вашей производительности.

Лучшей конструкцией может быть некая очередь или стек, в который несколько (2-4 в зависимости от количества CPU) рабочих потоков добавляют элементы и выгружают их для работы. Если элементу нужно поставить в очередь новый элемент, он просто добавляет его в стек (и добавляет себя обратно в стек с помощью некоторого вида отслеживания зависимости, если ему нужно подождать другой элемент).

4
ответ дан 13 December 2019 в 05:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: