programing

GCC의 __thread는 어떻게 구현됩니까?

topblog 2023. 10. 20. 13:22
반응형

GCC의 __thread는 어떻게 구현됩니까?

어떻게 있다.__threadgcc 구현?그냥 포장지 위에 있는 건가요?pthread_getspecific그리고.pthread_setspecific?

TLS용 posix API를 사용하는 제 프로그램으로, 제 프로그램 실행 시간의 30%가 사용되는 것을 보고 실망했습니다.pthread_getspecific. 자원이 필요한 각 함수 호출의 입력에 따라 호출했습니다.컴파일러가 최적화되지 않은 것 같습니다.pthread_getspecific인라인 최적화 후에따라서 함수가 인라인된 후 코드는 기본적으로 동일한 포인터를 반환받기 위해 올바른 TLS 포인터를 몇 번이고 검색합니다.

할 것이다__thread이런 상황에서 날 도와줄까요?나는 그것이 있다는 것을 압니다.thread_localC11에서, 하지만 내가 가지고 있는 gcc는 아직 그것을 지원하지 않습니다. (하지만 지금 보니 내 gcc가 지원합니다._Thread_local매크로가 아닙니다.)

저는 그것을 간단히 시험해 볼 수 있다는 것을 압니다.하지만 저는 지금 다른 곳으로 가야 하는데, 큰 재작성을 시도하기 전에 기능에 대해 더 잘 알고 싶습니다.

최근 GCC, 예를 들어 GCC 5는 C11 및 그를 지원합니다.thread_local(예를 들어 컴파일하는 경우).gcc -std=c11FUZxxl이 언급한 것처럼 (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_dataTLS 사용:

  .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_localC11)에서 아마도 사용하는 것보다 빠를 것입니다.pthread_getspecific(호의 오버헤드를 avoiding합니다.)

주의하세요.thread_local는 (C11 표준 헤더)에 정의된 편의 매크로입니다.

gcc__threadC11의 의미와 정확히 같은 의미를 가지고 있습니다._Thread_local 정보가 플랫폼마다 구현 세부 정보가 다르기 때문에 어떤 플랫폼에 프로그래밍할 것인지 알려주지 않습니다.예를 들어, x86 Linux에서 gcc는 메모리 명령으로 스레드 로컬 변수에 대한 접근을 컴파일해야 합니다.%fs호출 대신 세그먼트 접두사pthread_getspecific.

언급URL : https://stackoverflow.com/questions/32245103/how-is-gccs-thread-implemented

반응형