2008-09-18 4 views
1

.Net의 다양한 스레드간에 개체 컬렉션을 동기화하는 가장 좋은 방법은 무엇입니까?.Net의 다양한 스레드간에 개체 컬렉션을 동기화하는 가장 좋은 방법은 무엇입니까?

트렁크 안전 모드에서 다른 스레드에서 액세스하는 목록 또는 사전이 있어야합니다. 등을 추가, 제거 Foreachs와

당신은 잠금없는 큐 구현할 수
+0

여기에서하려는 일에 대해 명확하게 알고 싶을 수 있습니다. 이미 대기열 또는 해시 테이블에 대한 응답이 적절하거나 문제가되지 않을 수도 있습니다. 말한대로 말하기 어렵습니다. 문제에 대한 대략적인 설명을 통해보다 적절한 답변을 얻을 수 있습니다. –

+0

동의 함. 한 가지 요소는 컬렉션에 강력한 형식이 필요한지 여부입니다. –

답변

0

.Net의 여러 컬렉션 클래스는 동기화하고 여러 스레드에서 안전하게 액세스 할 수 있도록 지원합니다. 예를 들어 (C에서 ++/CLR) :


    Collections::Queue ^unsafe_queue = gcnew Collections::Queue(); 
    Collections::Queue ^safe_queue = Collections::Queue::Synchronized(unsafe_queue); 

당신은 unsafe_queue에 대한 참조를 던져, 그리고 safe_queue에 대한 참조를 유지할 수 있습니다. 스레드간에 공유 될 수 있으며 스레드 안전 액세스가 보장됩니다. ArrayList 및 Hashtable과 같은 다른 컬렉션 클래스도 이와 비슷한 방식으로이 작업을 지원합니다.

1

게시는 기본적으로는 사용하는 데 필요한 패턴에 따라 달라집니다. 여러 스레드에서 동일한 위치를 쓰고 읽는 경우 경쟁 조건을 방지하기 위해 잠금/모니터 또는 ReaderWriterLock과 함께 단일 스레드 (hastable, array 등)와 함께 사용했을 동일한 데이터 구조를 사용할 수 있습니다. 스레드간에 데이터를 전달해야하는 경우 그룹 A의 스레드가 삽입되고 그룹 B의 스레드가 대기열에서 벗어나는 일종의 대기열 (동기화 또는 lockfree)이 필요합니다. 대기열이 비어있을 때 CPU가 느슨해지지 않도록 WaitEvent (자동 재설정 또는 수동)를 사용할 수 있습니다. 정말 어떤 워크 플로우를 성취하고자하는지에 달려 있습니다.

관련 문제