2012-02-04 2 views
7

(역사적으로) 정적 버퍼에 대한 포인터를 반환하는 C 표준 라이브러리의 localtime과 같은 함수를 고려하십시오. C11은 이러한 버퍼를 스레드 로컬로 설정합니까? C11에서 7.1.4 당정적 버퍼에 대한 포인터를 반환하는 함수에 대한 C11 스레드 안전성

:

명시 적으로 따르는 상세한 설명에 별도로 명시하지 않는 한, 데이터 레이스를 방지해야 라이브러리 함수는 다음과 같이 스레드에 의해 라이브러리 기능을하여야한다 직접 또는 간접적으로 접근 객체에 액세스 할 수 없습니다 객체가 함수의 인수를 통해 직접 또는 간접적으로 액세스되지 않는 한 현재 스레드가 아닌 라이브러리 함수는 객체가 함수의 비 const 인수를 통해 직접 또는 간접적으로 액세스되지 않는 한 현재 스레드가 아닌 스레드가 액세스 할 수있는 객체를 직접 또는 간접적으로 수정해서는 안됩니다. 개체가 사용자에게 표시되지 않고 데이터 경합으로부터 보호되는 경우 구현은 스레드간에 자체 내부 개체를 공유 할 수 있습니다.

예를 들어 localtime을 고려하십시오. 반환 값이 가리키는 struct tm은 호출자가 액세스 할 수 있기 때문에 "내부 개체"로 간주되지 않으므로 다른 스레드에서 localtime을 호출하면 이전 스레드에서 반환 된 결과가 손상되지 않을 수 있습니다. 이는 localtime이 각 스레드마다 다른 버퍼를 사용해야 함을 의미합니다.

그러나 표준에서는 주소가 반환되는 개체의 수명이 끝나는 곳을 지정하지 않으며 호출하는 스레드가 종료 된 후에도 struct tm을 계속 사용하는 프로그램이 유효하지 않습니다. 따라서 객체는 스레드 저장 기간을 가질 수 없습니다.

구현이 모든 요구 사항을 충족 할 수 있다는 것을 알 수있는 유일한 방법은 의도 한 것이 아닌 곳곳에 메모리가 누출되는 것입니다. 명백한 무언가를 놓치고 있습니까, 아니면 레거시 인터페이스와 관련하여 스레드 안전성에 대한 C11의 대책입니까?

답변

8

... unless explicitly stated otherwise : 7.27.3 Time conversion functions의 소개 장에는 이러한 기능이 데이터 경합을 피할 수 없다고 명시 적으로 명시되어 있습니다. (다른 많은 라이브러리 함수와 마찬가지로)

경합 조건을 피하기 위해 설계된 표준 부속서 K의 범위 검사 확장에 _s 접미사가있는 파생 함수가 있습니다.

+0

좋아요, 나는 기능에 대한 특정 문서를 살펴 봤지만 소개는 살펴 보지 않았습니다. 내가 잃어버린 것을 찾은 것 같아. –

관련 문제