Mam generic Queue<T>
(System.Collections.Generic
), który jest dostępny do pisania z jednego wątku. I musi być dostępny z innego wątku do czytania.Czy kopiowanie całej kolejki <T> z operatorem "=" bezpieczne wątku (C#)
Nie chcę wykonywać żadnej synchronizacji procesu (która obejmuje używanie ConcurrentQueue<T>
) ze względu na wydajność. Więc wpadłem na pomysł, aby skopiować całą kolejkę do innego obiektu kolejki tego samego typu w wątku do czytania. Kolejne operacje w wątku do czytania będą wykonywane na kopii. Kopiowanie zostanie wykonane za pomocą prostego operatora =
.
Oto niektóre pseudo-code:
//Creating main queue
Queue<MyType> queue1 = new Queue<MyType>();
Pisanie Temat:
//Perform writing in the main queue
queue1.Enqueue(object);
...
queue1.Dequeue();
Czytając wątek:
//Copy main queue
Queue<MyType> queue2 = queue1;
//perform all operations in reading thread on queue2
Więc jest taki wątek rozwiązanie jest bezpieczne?
UPD: Dziękuję bardzo, nie wiedziałem, że to tylko kopiowanie linku. Czy istnieje sposób na skopiowanie całego obiektu według wartości w sposób bezpieczny dla wątków?
Wątek jest bezpieczny tylko wtedy, gdy nie zmienisz kolejki po opublikowaniu go w innym wątku. – Steven
Zwykle "Kolejka" ma być używana w scenariuszu producent/konsument. Np. Jeden wątek pisze do niego, a drugi czyta z niego. Nie ma sensu kopiowanie go za każdym razem (można użyć dowolnego typu kolekcji i będzie działać tak samo). Powinieneś użyć pojedynczej kolejki współdzielonej i zablokować ją zaraz po odłożeniu pojedynczego elementu lub użyć 'ConcurrentQueue', jak to opisano poniżej. – Groo