2011-09-27 5 views
3

해시가 두 스레드간에 공유되어 있고 thread1key1thread2과 단지 상호 작용하도록하려면 key2으로 스레드로부터 안전한 것으로 간주 할 수 있습니까? 그렇다면 key1key2을 만들어야 만 트레드에 해시를 공유 할 수 있습니까? 아니면 각 스레드가 자체 키를 만들 수 있습니까? Perl 해시 내부 메커니즘과 스레드의 동작에 대한 정보를 얻을 수있는 곳이 있습니까?Perl 스레드와 해시 키

답변

2

해시는 연결된 목록의 배열입니다. 해시 함수는 키를 값을 저장할 배열 요소 ("버킷")의 인덱스로 사용되는 숫자로 변환합니다. 하나 이상의 키가 동일한 인덱스 ("충돌")에 해시 될 수 있으므로 연결된 목록이이 경우를 처리합니다.

다른 스레드가 탐색하는 동안 (예 : 요소를 추가하기 위해) 스레드가 연결된 목록 중 하나를 수정하면 (예 : 요소를 가져 오기 위해) 문제가 발생할 수 있습니다.

이와 같이 요소를 추가하는 것은 안전하지 않습니다. 해시 (또는 배열)의 요소를 미리 작성하여이 문제를 해결할 수 있습니다.

이렇게하면 기존 요소에 액세스하는 것이 안전한지 여부에 대한 의문이 남습니다. 있을 수도 있지만 보증 할 수는 없습니다.

이러한 흥미를 찾을 수 있습니다

  • illguts

    펄 데이터 구조의 내부 세부로 들어갑니다.
  • Devel::Peek은 매우 유용한 도구입니다.
0

예, 다른 스레드가 서로의 키를 밟지 않는 한 괜찮습니다. 배열과 비슷한 개념을 사용합니다 (예 : 각 처리 스레드 레코드가 처리 된 항목 수를 처리하여 리포터 스레드가 배열의 항목을 매초마다 추가하고 결과를보고 할 수 있음).

+0

해시의 내부 구조는 배열보다 조금 복잡해야합니다. 시작시 각 배열의 고정 크기를 보장한다면 각 인덱스의 개별 조작에 대한 문제점은 기대하지 않지만 두 개 이상의 스레드가 "정확히 같은 시간에"새 크기에 맞게 배열을 확장해야한다면 Perl은이 스레드 안전 문제를 처리합니까? – cirne100

+0

예, 미리 지정된 수의 스레드 ('$ num_threads')가 있습니다. 스레드를 시작하기 전에'$ num_threads' 길이의 공유 배열을 0으로 채 웁니다. 그런 다음, 각 처리 스레드에 0에서'$ num_threads - 1'까지 (고유 한) 숫자를 전달합니다. –

관련 문제