Синхронизация объектов с использованием ThreadPool - PullRequest
1 голос
/ 05 февраля 2010

У меня есть несколько процессорных объектов, которые я использую с ThreadPool, чтобы использовать их в параллельном процессе. Какой процессор я собираюсь использовать, в основном зависит от входящих данных и может быть более 2000 различных типов; поэтому, как только моё приложение запускается, оно создает 1-2K процессоров в словаре и запускает тот, который мне нужен, согласно входящим данным в ThreadPool. Любой процесс занимает не более миллисекунды.

Мой код psuedo для запуска в ThreadPool приведен ниже:

public void onIncomingNewData(rawData)
{
     if (!ThreadPool.QueueUserWorkItem(processors[rawData.Type.Id].Process, rawData))
     {
         Console.WriteLine("Work item cannot be queued!");
      }

      //Thread.Sleep(1);
}

Моя проблема здесь заключается в синхронизации объектов Processer; у них есть свой внутренний кэш, и я не хочу, чтобы несколько потоков выполняли один и тот же метод процесса объектов Process.

В данный момент я использую «блокировку» внутри метода процесса и некоторые другие частные методы, которые обрабатывают вызовы метода. Но как лучше всего это сделать?

Ответы [ 2 ]

1 голос
/ 05 февраля 2010

В основном вам нужен пул процессоров в зависимости от типа. Вместо кэширования реального процессора в словаре процессоров создайте класс пула, который отслеживает доступные и активные процессоры. Когда приходит запрос, найдите соответствующий пул. Затем посмотрите, есть ли доступные процессоры. Если так, выньте это из доступного списка и поместите это в активный список. Запустите метод Process, затем удалите его из активного списка и поместите в доступный список.

Вы можете избежать использования активных / доступных списков и просто использовать вместо них активный флаг. В зависимости от количества одновременных процессов это может быть более эффективным.

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

Вам также, вероятно, нужно заблокировать доступ к словарю processors, если он уже не является потокобезопасным. Если словарь предварительно загружен на 100%, в этом нет необходимости.

0 голосов
/ 05 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...