GCC의 __thread는 어떻게 구현됩니까?
어떻게 있다.__thread
gcc 구현?그냥 포장지 위에 있는 건가요?pthread_getspecific
그리고.pthread_setspecific
?
TLS용 posix API를 사용하는 제 프로그램으로, 제 프로그램 실행 시간의 30%가 사용되는 것을 보고 실망했습니다.pthread_getspecific
. 자원이 필요한 각 함수 호출의 입력에 따라 호출했습니다.컴파일러가 최적화되지 않은 것 같습니다.pthread_getspecific
인라인 최적화 후에따라서 함수가 인라인된 후 코드는 기본적으로 동일한 포인터를 반환받기 위해 올바른 TLS 포인터를 몇 번이고 검색합니다.
할 것이다__thread
이런 상황에서 날 도와줄까요?나는 그것이 있다는 것을 압니다.thread_local
C11에서, 하지만 내가 가지고 있는 gcc는 아직 그것을 지원하지 않습니다. (하지만 지금 보니 내 gcc가 지원합니다._Thread_local
매크로가 아닙니다.)
저는 그것을 간단히 시험해 볼 수 있다는 것을 압니다.하지만 저는 지금 다른 곳으로 가야 하는데, 큰 재작성을 시도하기 전에 기능에 대해 더 잘 알고 싶습니다.
최근 GCC, 예를 들어 GCC 5는 C11 및 그를 지원합니다.thread_local
(예를 들어 컴파일하는 경우).gcc -std=c11
FUZxxl이 언급한 것처럼 (C11 대신) 을 사용할 수 있습니다.thread_local
) 더__thread
이전 GCC 버전에서 지원되는 한정자입니다.스레드 로컬 저장소에 대해 읽어 보십시오.
pthread_getspecific
함수 호출을 수반하기 때문에 실제로 상당히 느립니다(이것은 POSIX 라이브러리에 있으므로 GCC가 제공하지 않지만 GNU glibc 또는 musl-libc가 제공합니다).사용.thread_local
변수는 아마도 더 빠를 것입니다.
구현 예를 위해 MUSL의 파일의 소스 코드를 살펴봅니다.관련 질문에 대한 이 답변을 읽어 보십시오.
그리고._thread
&thread_local
로의 전화로 마법처럼 번역되지 않는 경우가 많습니다.pthread_getspecific
. 여기에는 보통 특정 주소 모드 및/또는 레지스터(자세한 내용은 ABI와 관련된 구현 특정)가 포함됩니다. 리눅스의 경우 x86-64는 더 많은 레지스터 및 주소 모드를 가지고 있으므로 TLS의 구현 속도가 i386보다 빠르다고 생각합니다.이는 반대로 발생할 수 있습니다.pthread_getspecific
내부적인 것들을 사용하고 있습니다.thread_local
변수(POSIX 스레드 구현 시).
예를 들어, 다음 코드를 컴파일하는 것.
#include <pthread.h>
const extern pthread_key_t key;
__thread int data;
int
get_data (void) {
return data;
}
int
get_by_key (void) {
return *(int*) (pthread_getspecific (key));
}
GCC 5.2 (Debian/Sid) 사용 및gcc -m32 -S -O2 -fverbose-asm
에 대해 다음과 같은 코드를 부여합니다.get_data
TLS 사용:
.type get_data, @function
get_data:
.LFB3:
.cfi_startproc
movl %gs:data@ntpoff, %eax # data,
ret
.cfi_endproc
그리고 다음의 코드.get_by_key
에 노골적으로 전화를 걸어pthread_getspecific
:
get_by_key:
.LFB4:
.cfi_startproc
subl $24, %esp #,
.cfi_def_cfa_offset 28
pushl key # key
.cfi_def_cfa_offset 32
call pthread_getspecific #
movl (%eax), %eax # MEM[(int *)_4], MEM[(int *)_4]
addl $28, %esp #,
.cfi_def_cfa_offset 4
ret
.cfi_endproc
따라서 TLS를 사용하여__thread
(또는thread_local
C11)에서 아마도 사용하는 것보다 빠를 것입니다.pthread_getspecific
(호의 오버헤드를 avoiding합니다.)
주의하세요.thread_local
는 (C11 표준 헤더)에 정의된 편의 매크로입니다.
gcc__thread
C11의 의미와 정확히 같은 의미를 가지고 있습니다._Thread_local
정보가 플랫폼마다 구현 세부 정보가 다르기 때문에 어떤 플랫폼에 프로그래밍할 것인지 알려주지 않습니다.예를 들어, x86 Linux에서 gcc는 메모리 명령으로 스레드 로컬 변수에 대한 접근을 컴파일해야 합니다.%fs
호출 대신 세그먼트 접두사pthread_getspecific
.
언급URL : https://stackoverflow.com/questions/32245103/how-is-gccs-thread-implemented
'programing' 카테고리의 다른 글
여러 문자열을 한 번에 바꾸기 (0) | 2023.10.20 |
---|---|
SQL 쿼리를 통해 모든 제품, 카테고리 및 메타데이터 우커머스/워드프레스를 얻을 수 있습니다. (0) | 2023.10.20 |
반복하는 동안 Python dict 수정 (0) | 2023.10.20 |
jQuery에 전역 값(반드시 전역 변수가 아님)을 저장하는 방법? (0) | 2023.10.20 |
구축 시 Swift 컴파일러 분할 오류 (0) | 2023.10.15 |