(역사적으로) 정적 버퍼에 대한 포인터를 반환하는 C 표준 라이브러리의 localtime
과 같은 함수를 고려하십시오. C11은 이러한 버퍼를 스레드 로컬로 설정합니까? C11에서 7.1.4 당정적 버퍼에 대한 포인터를 반환하는 함수에 대한 C11 스레드 안전성
:
명시 적으로 따르는 상세한 설명에 별도로 명시하지 않는 한, 데이터 레이스를 방지해야 라이브러리 함수는 다음과 같이 스레드에 의해 라이브러리 기능을하여야한다 직접 또는 간접적으로 접근 객체에 액세스 할 수 없습니다 객체가 함수의 인수를 통해 직접 또는 간접적으로 액세스되지 않는 한 현재 스레드가 아닌 라이브러리 함수는 객체가 함수의 비 const 인수를 통해 직접 또는 간접적으로 액세스되지 않는 한 현재 스레드가 아닌 스레드가 액세스 할 수있는 객체를 직접 또는 간접적으로 수정해서는 안됩니다. 개체가 사용자에게 표시되지 않고 데이터 경합으로부터 보호되는 경우 구현은 스레드간에 자체 내부 개체를 공유 할 수 있습니다.
예를 들어 localtime
을 고려하십시오. 반환 값이 가리키는 struct tm
은 호출자가 액세스 할 수 있기 때문에 "내부 개체"로 간주되지 않으므로 다른 스레드에서 localtime
을 호출하면 이전 스레드에서 반환 된 결과가 손상되지 않을 수 있습니다. 이는 localtime
이 각 스레드마다 다른 버퍼를 사용해야 함을 의미합니다.
그러나 표준에서는 주소가 반환되는 개체의 수명이 끝나는 곳을 지정하지 않으며 호출하는 스레드가 종료 된 후에도 struct tm
을 계속 사용하는 프로그램이 유효하지 않습니다. 따라서 객체는 스레드 저장 기간을 가질 수 없습니다.
구현이 모든 요구 사항을 충족 할 수 있다는 것을 알 수있는 유일한 방법은 의도 한 것이 아닌 곳곳에 메모리가 누출되는 것입니다. 명백한 무언가를 놓치고 있습니까, 아니면 레거시 인터페이스와 관련하여 스레드 안전성에 대한 C11의 대책입니까?
좋아요, 나는 기능에 대한 특정 문서를 살펴 봤지만 소개는 살펴 보지 않았습니다. 내가 잃어버린 것을 찾은 것 같아. –