我有通用的Queue<T>
(System.Collections.Generic
),它是從一個線程寫入訪問。它必須從另一個線程訪問以供閱讀。複製整個隊列<T>與運算符「=」線程安全(C#)
出於性能原因,我不想進行任何進程同步(其中包括使用ConcurrentQueue<T>
)。所以我想出了在讀線程中將整個隊列複製到另一個相同類型的隊列對象的想法。讀線程中的後續操作將在副本上完成。複製將通過簡單的操作員=
完成。
下面是一些僞代碼:
//Creating main queue
Queue<MyType> queue1 = new Queue<MyType>();
編寫線程:
//Perform writing in the main queue
queue1.Enqueue(object);
...
queue1.Dequeue();
讀線程:
//Copy main queue
Queue<MyType> queue2 = queue1;
//perform all operations in reading thread on queue2
那麼,這樣的解決方案線程安全的?
UPD:非常感謝,我不知道這只是複製鏈接。那麼有沒有辦法按照線程安全的方式通過值複製整個對象?
只有在您將其發佈到另一個線程後不更改隊列時,它纔是線程安全的。 – Steven 2012-02-13 17:39:07
通常,「Queue」意味着在生產者/消費者場景中使用。也就是說,一個線程寫入它,另一個線程讀取它。每次複製它都沒有什麼意義(您可以使用任何集合類型,並且它將工作相同)。您應該使用單個共享隊列並在您離隊單個項目時很快將其鎖定,或者使用下面所述的'ConcurrentQueue'。 – Groo 2012-02-13 18:38:33