System.Collections.Queue <T>, потоки, блокировка и синхронизация - PullRequest
3 голосов
/ 26 апреля 2011

У меня есть поле Queue<T>, доступ к которому осуществляется различными потоками.Enequeue() вызывается из нескольких потоков много раз в секунду, в то время как существует один поток, который выполняет операции Dequeue() и Count.

Я не очень задумывался над этимдо сих пор, поскольку я играл "безопасно" и использовал lock для статического объекта перед любыми операциями с этой очередью.Хотя в настоящее время нет проблем с производительностью, я бы хотел избавиться от блокировок, если они избыточны.Мои вопросы:

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

1 Ответ

3 голосов
/ 26 апреля 2011

1: да, они необходимы;оба состояния enqueue и dequeue mutate;стандартная очередь не является поточно-ориентированной

2: ConcurrentQueue<T> будет работать хорошо;лично я использую версию, которую я написал здесь для SO, Создание очереди блокировки в .NET? - это позволяет легко регулировать размер очереди и выполнять эффективные очереди без циклов

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

...