2010-02-03 8 views
2

각 스레드가 배열의 다른 요소에서 작동하는 여러 스레드에 의해 배열에 액세스하는지 여부를 누구든지 설명 할 수 있습니까?배열의 스레드 안전 컨테이너

n 요소가 있고 n threads ==> n 번째 스레드가 배열의 n 번째 요소에서 작동하고 있습니까?

누구나 이것이 안전한지 설명 할만큼 친절 할 수 있습니까? 왜 또는 왜?

감사합니다. p.s. 이 스레드 안전 바와 같이 언어 C# 또는 자바, 파이썬하지만 비의 언어 전문가

+1

왜 그렇게하고 싶습니까? 이것을위한 목적은 무엇입니까? –

+0

각 스레드와 함께 HTTP 호출을 통해 SOAP를 실행하고 있습니다. - 주 스레드에서 수행 중이면 스레드가 "n"개의 HTTP 응답을 기다리고 있기 때문에 성능이 저하되고 있습니다. 위의 시나리오에서 각 스레드는 독립적입니다. 응답의 합계 대신 가장 긴 응답 시간으로 내 프로그램을 최소화합니다. 입력 사항은 무엇입니까? – bushman

답변

2

이 의지, 대부분의 언어에서, (한 번에 하나 개의 스레드 내에서 특정 배열 요소를 사용하고 제공) 안전 - 그러나, 그것은 좋은 생각이 아니다.

주된 문제는 허위 공유 중 하나입니다. 배열의 항목을 여러 스레드에서 쓰면 캐시 라인을 끊임없이 교환하기 때문에 성능이 매우 저하 될 수 있습니다. C# 및 Java와 같은 관리 언어에서 특히 나쁜 생각입니다. 예를 들어, C#에서는 CLR이 배열 검사를 수행합니다. 이로 인해 모든 배열 액세스가 배열의 첫 번째 요소 바로 앞에 저장된 변수 (길이)에 액세스하게되어 지속적으로 캐시 누락이 발생합니다. 이것에 대한 훌륭한 데모는 Igor Ostrovsky at PDC입니다.이 문제로 인해 병렬 처리가 연속적으로 처리하는 것보다 여러 번 느려질 수 있습니다.

그것은 사실 후 배열을 "구성"별도의 데이터 변수로 스레드로 작업을 밀어 더 나은 생각합니다.

+0

입력 해 주셔서 감사합니다. Reed. 최근에 캐시 쓰레기에 대해 읽은 것뿐 이었지만 언급 할 때까지 점을 연결하지 못했습니다. 나는 할당 된 요구 사항이 스레드와 함께 제공되는 것이 더 좋을 것이라고 내기하고 있습니다. 스레드 수를 아주 작은 양으로 제한하고 있습니다. 고맙습니다. – bushman

+0

예, 스레드 당 HTTP 호출을하는 경우 문제가되지 않을 수 있습니다 ... –

2

을에서 다른 입력을 사랑하는 것이 주요 관심, 배열의 각 항목이와 상호 작용하지 않는 다른 개체라는 것을 제공 서로.

스레드가 작동하는 동안 배열에서 항목을 추가하거나 제거하지 마십시오.