Является ли реализация LinkedList потоком .Net безопасным? - PullRequest
2 голосов
/ 26 апреля 2011

На самом деле я работаю над приложением, которое использует несколько потоков для работы над количеством задач, и родительское приложение получает выходные данные задачи, позже для записи в файлы, в настоящее время я использую arraylist для добавления вывода, но это происходит медленно при удалении элементов из очереди. Я думал преобразовать часть массива в связанный список для оптимизированного чтения и очистки, может кто-нибудь подтвердить, что мы меня если реализаций связанный .List .Net является потокобезопасным или даже с использованием arraylist был потокобезопасным?

Ответы [ 3 ]

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

ссылка утверждает, что:

Этот тип не является потокобезопасным. Если LinkedList (Of T) должен быть доступен несколькими потоками вам понадобится реализовать собственную синхронизацию механизм.

LinkedList (Of T) может поддерживать несколько читателей одновременно, как долго так как коллекция не изменена. Несмотря на это, перечисляя через коллекция изначально не потокобезопасная процедура. В редких случай, когда утверждается перечисление с доступом записи, коллекция должен быть заблокирован в течение всего перечисление. Разрешить сбор быть доступным для нескольких потоков для читать и писать, вы должны реализовать собственную синхронизацию.

EDIT:

Что касается ArrayList, ссылка гласит:

Публичная статика члены этого типа являются потокобезопасными. Любые члены экземпляра не являются гарантированно безопасен для потоков.

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

Перечисление через коллекцию по сути не потокобезопасный процедура. Даже когда коллекция синхронизированы, другие потоки все еще могут изменить коллекцию, которая вызывает перечислитель для исключения. Чтобы гарантировать безопасность нити во время перечисление, вы можете заблокировать Коллекция в течение всего Перечисление или ловить исключения в результате изменений, сделанных другими резьб.

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

Поскольку вы пометили его как C # 4, используйте BlockingCollection<T>.

Это поточно-ориентированный и позволит вам при необходимости регулировать трафик.

Этот класс коллекции был разработан для этой задачи. Но производительность коллекции не должна иметь большого значения, когда вы в конечном итоге записываете в File.

0 голосов
/ 13 октября 2011

Любой потокобезопасный набор в пространстве имен System.Collections.Concurrent должен выполнить эту работу за вас. Однако, с хорошей точки зрения, я не думаю, что они будут работать лучше, чем Array, учитывая, что будут некоторые издержки синхронизации. Ваши два запроса потокобезопасности и производительности могут быть не достижимы одновременно, вам может потребоваться прийти к некоторому компромиссу

Подробнее см. http://msdn.microsoft.com/en-us/library/dd267265.aspx

...