Queue<T>
является ссылочным типом. Поэтому присвоение queue1
queue2
только копирует ссылку, а не саму очередь.
Само назначение является атомарным и, следовательно, потокобезопасным. Доступ к queue1
в одном потоке и queue2
в другом не безопаснее, чем к queue1
из обоих. то есть это небезопасно.
Я считаю, ConcurrentQueue<T>
использует методы программирования без блокировки (Interlocked.Exchange
и друзья) и работает довольно быстро. Вы должны сначала сравнить его, прежде чем исключать как решение.
Копирование Queue<T>
, безусловно, будет медленнее, чем просто использование ConcurrentQueue<T>
.
В моей системе с частотой 2,6 ГГц ConcurrentQueue<object>
управляет 15 миллионами пар очереди / очереди в секунду по сравнению с 40 миллионами при Queue<object>
. Так что Queue<object>
примерно в три раза быстрее.
200 циклов ЦП для пары enqueue / dequeue довольно дешевы. Если это узкое место, попробуйте использовать более гранулированные элементы в очереди.