2011-04-26 5 views
2

실제로 여러 스레드를 사용하여 여러 작업을 처리하는 응용 프로그램에서 작업 중이며 부모 응용 프로그램은 나중에 출력을 추가하는 arraylist를 사용하여 나중에 파일에 쓰게됩니다. 대기열에서 항목을 제거 할 때 속도가 느려집니다. arraylist 부분을 최적화 된 읽기 및 지우기를위한 연결 목록으로 변환하려고 생각하고 있었는데 누구나 우리가 나를 확인할 수 있습니까?. linkedList 구현. threadsafe 또는 threadsafe인지 arraylist를 사용하고 있습니까?. LinkedList 구현은 .Net threadsafe입니까?

+0

ArrayList를 참조, 일부 트레이드 오프 포인트 이상

에 와서해야 할 수도 있습니다 , 특정 유형을 처리하는 콜렉션에 대해 작업 할 수 없습니까? –

+0

나는 수천 건의 레코드를 받았다. 즉, 나는 약간의 메모리 의식이 있어야만한다는 것을 의미한다. – CodeWrite

+0

List가 ValueTypes를 저장한다면 복싱 만있을 것이다. 나는 그것을 Q에서 읽지 않는다. –

답변

6

reference 상태는 것을 :

이 유형은 스레드로부터 안전하지 않습니다. LinkedList (Of T)를 복수 스레드로 에 액세스해야하는 경우 은 자체 동기화 메커니즘을 구현해야합니다.

LinkedList (Of T)는 컬렉션이 수정되지 않았으므로 여러 판독기를 동시에 지원할 수 있습니다. 그래도 컬렉션을 통해 열거하는 것은 본질적으로 스레드 안전 프로 시저가 아닙니다. 드문 경우 인 열거 형이 쓰기 액세스로 을 차지하는 경우 전체 열거 중에 컬렉션을 잠 가야합니다. 컬렉션을 읽고 쓰는 여러 스레드에서 액세스 할 수있게하려면 자신의 동기화를 구현해야합니다.

편집 : ArrayList에 관해서는

reference 상태 : (Visual Basic의 경우 Shared)

공공 정적이 유형의 멤버는 스레드로부터 안전합니다. 모든 인스턴스 구성원은 스레드 안전성이 보장 된 이 아닙니다.

컬렉션이 수정되지 않는 한 ArrayList는 복수 리더를 동시에 지원할 수 있습니다. 은 ArrayList의 스레드 안전성을 보장하기 위해 모든 작업은 동기화 메서드에서 반환 된 래퍼를 통해 을 수행해야합니다.

컬렉션을 통해 열거하는 것은 본질적으로 스레드 안전 절차가 아닙니다. 입니다. 컬렉션이 인 경우에도 다른 스레드는 컬렉션을 수정할 수 있으므로 열거자가 예외를 throw합니다. 열거 중에 스레드 안전을 보장하려면 전체 열거 중에 컬렉션을 잠 그거나 다른 스레드가 변경 한 내용으로 인해 예외를 catch 할 수 있습니다.

2

C# 4 태그를 지정 했으므로 BlockingCollection<T>을 사용하십시오.

이것은 스레드로부터 안전하며 필요할 때 트래픽을 조절할 수있게 해줍니다.

이 컬렉션 클래스는 작업을 위해 설계되었습니다. 그러나 결국 파일에 쓸 때 컬렉션의 성능은 중요하지 않습니다.

0

네임 스페이스 System.Collections.Concurrent에서 모든 스레드로부터 안전한 컬렉션이 작업을 수행해야합니다. 그러나, perf 관점에서, 나는 그들이 어떤 syncroniazation 오버 헤드가있을 것이라고 생각 어레이보다 잘 수행 할 생각하지 않습니다. 당신이 요청 스레드 safetiness과 성능을 동시에 achieveable하지 않을 수 있습니다, 당신은 어쨌든 때문에 복싱/언 박싱의 느려질 수 http://msdn.microsoft.com/en-us/library/dd267265.aspx