2013-08-06 4 views
1

네이티브 코드 (C/C++)가 주어지면 누군가 스레드 로컬 저장소를 설명 할 수 있습니까? 스레드가 자신의 변수의 수명을 제어 할 수있게 해주는 트릭입니까? 아니면 컴파일러 나 하드웨어에서 격리/보호 강제가 있습니까?로컬 저장소에 스레드하기/Windows

아래 플랫폼이 중요합니까?

더욱이, 위와 관련하여 일반 TLS와 "광섬유 안전성"TLS의 차이점은 무엇입니까?

미안하지만, 내가 봤어,하지만 내가 찾을 수있는 방법은 TLS (내가 이미 알고있는)를 사용하는 것이지만 그 배경의 괴상한 세부 사항은 아니다.

+0

TLS의 전체 설명을 보려면이 링크 (내 기사 아님)를 확인하십시오. http://bryanpendleton.blogspot.com/2010/11/ken-johnsons-exposition-of-thread-local.html – HerrJoebob

답변

3

스레드 로컬 저장소 (TLS)는 OS에서 관리합니다. 커널의 모든 스레드 객체는 TLS 슬롯의 로컬 배열을 포함합니다. 런타임에 앱의 코드는 컴파일러에 따라 __thread 또는 __declspec(thread)으로 선언 된 변수와 같이 필요로하는 각 TLS 변수에 대해 을 호출하여 TLS 배열에 사용 가능한 색인을 예약 할 수 있습니다. 그런 다음 각 스레드는 TlsGetValue()TlsSetValue()을 사용하여 해당 인덱스의 호출 스레드의 TLS 배열에 저장된 값을 읽거나 쓸 수 있습니다. TLS를 사용하면 앱에서 TlsFree()을 호출하여 예약 된 색인을 해제 할 수 있습니다.

예를 들어, 응용 프로그램을 시작할 때, 응용 프로그램은 이후, 주어진 스레드가 TLS 인덱스 0 TlsSetValue()를 호출 할 수 있습니다 실행하는 각 스레드 내부 TLS 인덱스 0을 예약 한 번 TlsAlloc() 호출하고 그 값은 특정 로컬로 저장됩니다 따라서 다른 스레드에 대한 TLS 인덱스 0에 저장된 값은 영향을받지 않습니다.

은 자세한 내용은 MSDN을 참조 : 스레드 내에서 실행

Thread Local Storage

섬유를. 따라서 같은 스레드에서 실행되는 여러 개의 광섬유가 해당 스레드에 대해 동일한 TLS 배열을 공유합니다. 하나의 광섬유가 TLS 인덱스 0에서 값을 설정하면 동일한 스레드에서 실행중인 모든 광섬유가 영향을받습니다. 파이버 안전 TLS는 파이버가 수명 기간 동안 한 스레드에서 다른 스레드로 점프하는 경우 파이버가 TLS 정보를 캐싱하지 못하게하는 컴파일러 최적화입니다.

+0

참고 __declspec (thread)의 함정 : "__declspec (thread) 선언 된 변수 사용의 결과"http://blogs.msdn.com/b/oldnewthing/archive/2010/11/22/10094489.aspx –

+0

좋습니다. 알아. 고마워. –

+0

고맙습니다. OS 레벨 실행은 다른 스레드가 로컬 변수를 보지 못하도록하는 등 프로세스 공간을 파고 들기와 같은 보안 유형을 의미합니까? 나는 그것이 바람직한 이유에 대한 좋은 예를 가지고 있지는 않지만 "OS에 의해 관리되는"것이 무엇인지 이해하려고 노력하고 있습니다. –

0

빠른 응답 : 스레드가 시작될 때 GS 세그먼트 레지스터는 해당 스레드에 대한 (대부분 문서화되지 않은) OS 데이터 구조를 가리 킵니다. 이 데이터 구조의 요소 중 하나는 최대 64 개의 TLS 변수를 저장하기 위해 TLS 함수에서 사용하는 64 개의 PVOID 요소의 배열입니다.

+0

많은 Windows 구조가 문서화되지 않은 것처럼 보입니다. 비록 Windows가 80 년대부터 존재 해 왔지만 지금은 2014 년입니다. 아직 문서화되지 않았습니다. – farmdve

+0

@farmdve : 일반적으로 내부 구현 세부 정보를 공개적으로 문서화하지 않는 것이 좋습니다. 변경 사항을 나중에 변경하는 것이 훨씬 어렵 기 때문입니다. MS 내의 관련 팀은 자체적 인 문서를 보유 할 것이며, 물론 대중에게 공개되지는 않습니다. –

관련 문제