Шаблон проектирования для нескольких запрашивающих, где только один вызывает выборку ресурса, и все уведомляются, когда он становится доступным? - PullRequest
0 голосов
/ 14 февраля 2011

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

Например, два или более потоков запрашивают файл ресурсов, полученный по сети. Первый в блокирует два других потока. Первый поток генерирует один запрос, а затем ожидает, пока ресурс станет доступным, как и два других ожидающих потока.

Когда я говорю "ожидание", они на самом деле не ждут блокировки, они проверяют переменную или что-то еще, потому что это уже часть пула потоков, поэтому другие потоки могут выполнять другую работу.

Как называется этот шаблон проектирования?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2011

У вас есть примерно три варианта:

  • Используйте идею 'futures' - в java есть интерфейс java.util.concurrent.Future, но идея легко выражается на других языках -с первым потоком, создающим будущее и помещающим его в глобальную карту, а затем потоки, выбирающие его и ожидающие его реализации, или проверяющие, когда они могут, и действующие на него, когда он будет готов.
  • Использованиефьючерсы, но передают первый поток другому потоку (из пула) для фактической загрузки;это включает в себя больше потоков, но делает код для основных потоков проще, потому что им не нужно беспокоиться о том, является ли он первым потоком или нет.
  • Поместите использование загруженного ресурса в обратный вызов, зарегистрированный основными потоками и вызываемый потоком, который загружает ресурс.

Мне нравится второй вариант, но выбор действительно зависит от ваших конкретных требований.

0 голосов
/ 14 февраля 2011

Вы имеете в виду Mutex.TryLock()?

Отказ от ответственности: в терминологии Windows / .NET;имена и синтаксис могут отличаться на других платформах и языках.

...