해시가 두 스레드간에 공유되어 있고 thread1
이 key1
및 thread2
과 단지 상호 작용하도록하려면 key2
으로 스레드로부터 안전한 것으로 간주 할 수 있습니까? 그렇다면 key1
과 key2
을 만들어야 만 트레드에 해시를 공유 할 수 있습니까? 아니면 각 스레드가 자체 키를 만들 수 있습니까? Perl 해시 내부 메커니즘과 스레드의 동작에 대한 정보를 얻을 수있는 곳이 있습니까?Perl 스레드와 해시 키
3
A
답변
2
해시는 연결된 목록의 배열입니다. 해시 함수는 키를 값을 저장할 배열 요소 ("버킷")의 인덱스로 사용되는 숫자로 변환합니다. 하나 이상의 키가 동일한 인덱스 ("충돌")에 해시 될 수 있으므로 연결된 목록이이 경우를 처리합니다.
다른 스레드가 탐색하는 동안 (예 : 요소를 추가하기 위해) 스레드가 연결된 목록 중 하나를 수정하면 (예 : 요소를 가져 오기 위해) 문제가 발생할 수 있습니다.
이와 같이 요소를 추가하는 것은 안전하지 않습니다. 해시 (또는 배열)의 요소를 미리 작성하여이 문제를 해결할 수 있습니다.
이렇게하면 기존 요소에 액세스하는 것이 안전한지 여부에 대한 의문이 남습니다. 있을 수도 있지만 보증 할 수는 없습니다.
이러한 흥미를 찾을 수 있습니다
- illguts 펄 데이터 구조의 내부 세부로 들어갑니다.
- Devel::Peek은 매우 유용한 도구입니다.
0
예, 다른 스레드가 서로의 키를 밟지 않는 한 괜찮습니다. 배열과 비슷한 개념을 사용합니다 (예 : 각 처리 스레드 레코드가 처리 된 항목 수를 처리하여 리포터 스레드가 배열의 항목을 매초마다 추가하고 결과를보고 할 수 있음).
관련 문제
- 1. 배열에 의해 결정되는 Perl 해시 키
- 2. perl - 올바른 해시 키 찾기 조건 설정
- 3. grep perl 해시 키 배열 방법?
- 4. Perl 해시 함수의 해시
- 5. Perl Windows 환경 키 저장하기
- 6. 해시 키 검색 방법
- 7. 해시 테이블 키 생성
- 8. Perl에서 해시 키 값을 어떻게 정의하지 않습니까?
- 9. 왜 perl "목록 해시"가이 작업을 수행합니까?
- 10. Facebook 앱 키 해시 사용
- 11. 해시 키 URL 매개 변수?
- 12. 루비 : 삭제 여러 해시 키
- 13. Perl XML :: Twig 출력을 해시 참조로 사용
- 14. Perl : 해시 키를 정규 표현식에 일치 시키십시오.
- 15. Perl, 모든 해시 값 가져 오기
- 16. 리터럴 점이있는 Perl 해시 키를 사용하려면 어떻게해야합니까?
- 17. 프로세스간에 Perl 해시 참조를 전달할 수 있습니까?
- 18. 새 Perl 사용자 : 배열 해시 사용
- 19. Perl 해시 참조의 단순 복사본을 만들려면 어떻게해야합니까?
- 20. 해시 함수 : 해시 키 (데이터 개체의 이름)를 XY 좌표로
- 21. 스레드와 ProgressDialog
- 22. Perl 스크립트를 Python으로 변환 : 해시 키 기반의 파일 2 개를 중복 제거
- 23. 최대 값을 갖는 모든 해시 키/값 쌍을 반환합니다.
- 24. 해시 맵에서 키 목록을 반환하는 방법은 무엇입니까?
- 25. firefox 캐시 해시 키 생성 알고리즘 버그
- 26. 숫자 값 내림차순으로 해시 맵 키 정렬
- 27. 루비에서 문자열의 키/값으로 해시 병합
- 28. .NET Hashtable - "같은"키, 다른 해시
- 29. 키 값 쌍 목록을 해시 테이블로 변환
- 30. XMLSimple는 키 값이 해시 구문 분석
해시의 내부 구조는 배열보다 조금 복잡해야합니다. 시작시 각 배열의 고정 크기를 보장한다면 각 인덱스의 개별 조작에 대한 문제점은 기대하지 않지만 두 개 이상의 스레드가 "정확히 같은 시간에"새 크기에 맞게 배열을 확장해야한다면 Perl은이 스레드 안전 문제를 처리합니까? – cirne100
예, 미리 지정된 수의 스레드 ('$ num_threads')가 있습니다. 스레드를 시작하기 전에'$ num_threads' 길이의 공유 배열을 0으로 채 웁니다. 그런 다음, 각 처리 스레드에 0에서'$ num_threads - 1'까지 (고유 한) 숫자를 전달합니다. –