22
__thread Foo foo;
"foo"는 실제로 어떻게 해결 되었습니까? 컴파일러는 자동으로 "foo"의 모든 인스턴스를 함수 호출로 대체합니까? "foo"는 스택 하단에 상대적으로 저장되어 있으며 컴파일러는 "이봐, 각 스레드에 대해이 공간을 스택 맨 밑에두고 foo는 스택의 맨 아래에서 오프셋 x"로 저장합니다. "?리눅스의 스레드 로컬 저장소 구현
__thread Foo foo;
"foo"는 실제로 어떻게 해결 되었습니까? 컴파일러는 자동으로 "foo"의 모든 인스턴스를 함수 호출로 대체합니까? "foo"는 스택 하단에 상대적으로 저장되어 있으며 컴파일러는 "이봐, 각 스레드에 대해이 공간을 스택 맨 밑에두고 foo는 스택의 맨 아래에서 오프셋 x"로 저장합니다. "?리눅스의 스레드 로컬 저장소 구현
다소 복잡합니다 (this document에서 자세히 설명합니다).하지만 기본적으로 마찬가지입니다. 대신 컴파일러는 모든 스레드 로컬 변수를 포함하는 실행 파일에 특별한 .tdata 섹션을 넣습니다. 런타임시 각 스레드에 대한 새로운 데이터 섹션이 (읽기 전용) .tdata 섹션에 데이터 복사본과 함께 생성되며 스레드가 런타임에 전환되면 섹션도 자동으로 전환됩니다.
결과적으로 __thread 변수는 일반 변수만큼 빠르며 여분의 스택 공간도 차지하지 않습니다.
멀티 스레드이지만 코어가 하나 뿐인데 어떻게 작동하는지 확인할 수 있습니다. 멀티 스레드 및 멀티 코어가있는 경우이 .tdata 섹션은 어떻게 작동합니까? – anon
@anon : 두 번째 경우에 어떤 차이가 있습니까? –
시간 01 : 코어 1은 스레드 1을 실행합니다. 스레드 1의 스왑 .tdata; 시간 02 : 코어 2는 스레드 2를 실행하고; 스레드 2의 스왑 .tdata; 이제 thread1의 갑자기 thread2의 .tdata를 사용하지 않습니까? – anon