2013-09-27 7 views
3

ANSI C 시간 함수는 스레드 안전하지 않습니다. 특히 gmtime, ctimestrftime입니다. 내가 아는 한 스레드 안전 함수는 time입니다.스레드 안전 ctime 함수 구현

Visual Studio에서 제대로 작동하는 경우이 함수는 모두 스레드로부터 안전합니다. MinGW 컴파일러 (Qt 5.1.0에서 제공되는 dwarf-2와 4.8.0)를 사용하고 있습니다.

gmtime_r, ctime_rstrftime_r의 스레드 안전 기능을 어떻게 보완 할 수 있습니까? 아니면 거기에 더 많은 thread - safe 라이브러리가 있습니까?

기본 언어로 C++ 11을 사용하고 있습니다.

윈도우 XP에서 편집 한
내가는 MinGW 4.8.0 사용하고 있습니다 (POSIX를, 난쟁이-2).

편집 2
Boost.DateTime을 사용하는 것이 좋습니다.

저는 C++ 11의 부족함에 대해 매우 실망했습니다!

+0

표준 POSIX 라이브러리가 없다고 추측합니다. 그렇지 않으면 이미 ['ctime_r'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/ctime.html)이 있습니다. et al. 그리고 C++ 11에서는 [std :: chrono' 네임 스페이스] (http://en.cppreference.com/w/cpp/chrono)가 있습니다. –

+0

Windows XP에서 MinGW를 사용하고 있습니다. 그리고이 기능을 제공하지 않기 때문에 직접 구현해야합니다. –

답변

2

실제로 gmtime_rctime_rpthread.h에 있어야하지만 버그 (http://sourceforge.net/p/mingw/bugs/1625/)로 인해 일시적으로 제거됩니다.

당신은 몇 가지 선택

    그냥 safe_increment처럼 lock_guard를 사용하는 모든 기능에 대한 재진입 래퍼를 확인
  1. MiniGW
  2. 를 사용하여 이전 버전의 수정 될 것입니다 때까지
  3. 대기 완료했다 here
  4. 그리고 가장 좋은 방법은 함수 형식을 사용하는 것입니다. chrono 헤더 파일이 C++ 11에 의해 추가되었습니다.
+0

불행히도'std :: chrono'는 내 요청을 고쳐 내지 못한다 : 나는 time_t를 주어야한다. ('SetSystemTime'과'settimeofdat'을 사용하는 윈도우와 리눅스 모두에서). 그리고 MinGW의 이전 버전은 도움이되지 않습니다. 나는 모든 마지막 C++ 11 기능을 사용하고있다. –

+0

나는 시스템 시간을 설정하는 것이 많은 "광대 한"동작이어서 잠금을하는 것으로 추측하고 있으므로 std :: lock_guard를 시도한다. – tomas789

0

MinGW arleady는 gmtime_r 및 gmtime_s 기능을 모두 제공하지만 std 네임 스페이스의 노트입니다.