스레드 로컬 저장소 지원¶
Python 인터프리터는 스레드 로컬 저장소(TLS)를 위한 낮은 수준의 지원을 제공하며, 이는 기본 네이티브 TLS 구현을 래핑하여 Python 수준의 스레드 로컬 저장소 API (threading.local)를 지원합니다. CPython C 레벨 API는 pthreads 및 Windows에서 제공하는 API와 유사하며, 스레드 키와 함수를 사용하여 스레드별로 void* 값을 연관시키는 방식을 사용합니다.
이 함수들을 호출할 때 :term:`thread state`는 :term:`attached <attached thread state>`가 필요하지 않습니다. 자체 잠금 처리를 제공합니다.
:file:`Python.h`에는 TLS API 선언이 포함되어 있지 않으니, 스레드 로컬 저장을 사용하려면 :file:`pythread.h`를 포함해야 합니다.
참고
이 API 함수들 중 어느 것도 void* 값에 대해 메모리 관리를 처리하지 않습니다. 직접 할당하고 해제해야 합니다. 만약 void* 값들이 :c:expr:`PyObject*`인 경우, 이 함수들은 참조 카운트 연산도 수행하지 않습니다.
스레드별 저장소 API¶
스레드별 저장소(TSS) API는 CPython 인터프리터 내에서 기존 TLS API 사용을 대체하기 위해 도입되었습니다. 이 API는 스레드 키를 나타내기 위해 int 대신 새로운 타입 :c:type:`Py_tss_t`를 사용합니다.
Added in version 3.7.
더 보기
“CPython의 스레드-로컬 저장소를 위한 새로운 C-API” (PEP 539)
동적 할당¶
Dynamic allocation of the Py_tss_t, required in extension modules
built with Py_LIMITED_API, where static allocation of this type
is not possible due to its implementation being opaque at build time.
-
Py_tss_t *PyThread_tss_alloc()¶
- 상의 안정 ABI 버전 3.7 이후로.
Py_tss_NEEDS_INIT으로 초기화된 값과 같은 상태의 값을 반환하거나, 동적 할당 실패 시NULL을 반환합니다.
-
void PyThread_tss_free(Py_tss_t *key)¶
- 상의 안정 ABI 버전 3.7 이후로.
PyThread_tss_alloc()으로 할당된 주어진 key 를 해제합니다. 이전에PyThread_tss_delete()를 호출하여 연결된 모든 스레드 로컬 값들이 해제되었는지 확인해야 합니다. key 인자가NULL이면 아무런 작업도 수행하지 않습니다.참고
해제된 키는 위험한 포인터가 됩니다. 키를
NULL로 재설정해야 합니다.
메서드¶
이 함수들의 매개 변수 key 는 NULL 이 아니어야 합니다. 또한, 주어진 Py_tss_t 가 PyThread_tss_create() 에 의해 초기화되지 않았다면, PyThread_tss_set() 와 PyThread_tss_get() 의 동작은 정의되지 않습니다.
-
int PyThread_tss_is_created(Py_tss_t *key)¶
- 상의 안정 ABI 버전 3.7 이후로.
주어진 :c:type:`Py_tss_t`가 :c:func:`PyThread_tss_create`에 의해 초기화되었으면 0이 아닌 값을 반환합니다.
-
int PyThread_tss_create(Py_tss_t *key)¶
- 상의 안정 ABI 버전 3.7 이후로.
TSS 키 초기화에 성공하면 0 값을 반환합니다. key 인자가 가리키는 값이 :c:macro:`Py_tss_NEEDS_INIT`에 의해 초기화되지 않았다면 동작이 정의되지 않습니다. 이 함수는 같은 키에서 반복적으로 호출될 수 있습니다. 이미 초기화된 키에 호출하면 아무 작업도 수행하지 않으며 즉시 성공을 반환합니다.
-
void PyThread_tss_delete(Py_tss_t *key)¶
- 상의 안정 ABI 버전 3.7 이후로.
TSS 키를 삭제하여 모든 스레드에서 키와 관련된 값을 잊게 하고, 키의 초기화 상태를 초기화되지 않음으로 변경합니다. 파괴된 키는
PyThread_tss_create()\로 다시 초기화할 수 있습니다. 이 함수는 같은 키에서 반복적으로 호출될 수 있습니다 – 이미 파괴된 키에 대해 호출하면 아무런 일도 하지 않습니다.
레거시 API:¶
버전 3.7부터 폐지됨: 이 API는 스레드별 저장소 (TSS) API\로 대체됩니다.
참고
이 버전의 API는 네이티브 TLS 키가 int 로 안전하게 캐스팅될 수 있는 방식으로 정의되지 않은 플랫폼을 지원하지 않습니다. 그러한 플랫폼에서는, PyThread_create_key() \가 즉시 실패 상태와 함께 반환되며, 다른 TLS 함수들은 모두 효과가 없습니다.
위에 언급된 호환성 문제로 인해, 이 버전의 API는 새 코드에서 사용해서는 안 됩니다.