2013-09-27 7 views
3

Функция времени ANSI C не является надежной по потоку: в частности gmtime, ctime и strftime. Для того, что я знаю, единственная поточно-безопасная функция - time.Реализовать поточную безопасную функцию ctime

Если я прав в Visual Studio, эта функция является безопасной для всех потоков. Я использую компилятор MinGW (4.8.0 с карликом-2, тот, который предоставляется Qt 5.1.0).

Как можно реализовать функцию защиты резьбы от gmtime_r, ctime_r и strftime_r? Или для этого существует более поточная библиотека?

Я использую C++ 11 в качестве языка по умолчанию.

редактировать 1
Я использую MinGW 4.8.0 (POSIX, карлик-2) на Windows XP.

редактировать 2
Я рассматриваю использовать Boost.DateTime это может быть хорошим выбором?

Я очень разочарован отсутствием на C++ 11 управления временем!

+0

Я предполагаю, что у вас нет стандартной библиотеки POSIX, так как иначе у вас уже есть ['ctime_r'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/ctime.html) и другие. И с C++ 11 у вас есть пространство имен '' std :: chrono' '(http://en.cppreference.com/w/cpp/chrono). –

+0

Я использую MinGW для Windows Xp. И он не обеспечивает эти функции ... поэтому я должен сам реализовать его. –

ответ

2

Фактически должно быть gmtime_r и ctime_r в pthread.h, но они временно удалены из-за ошибки (http://sourceforge.net/p/mingw/bugs/1625/).

У вас есть несколько вариантов

  1. Подождите, пока она не будет исправлена ​​
  2. Использовать старую версию MiniGW
  3. Сделать возвратную оболочку для всех этих функций с помощью lock_guard так же, как safe_increment сделал here
  4. И, возможно, лучший способ - использовать функции формы chrono файл заголовка, добавленный C++ 11
+0

unfortunatly 'std :: chrono' doesnt't sutisfy мои запросы: мне нужно дать time_t установить O.S. (как в windows, так и в linux с 'SetSystemTime' и' settimeofdat'). И более старая версия MinGW не помогает. Я использую все последние возможности C++ 11. –

+0

Я предполагаю, что системное время настройки - это «экспансивная» операция, а затем блокировка, поэтому попробуйте std :: lock_guard. – tomas789

0

MinGW arleady обеспечивает функцию gmtime_r и gmtime_s, но они являются примечанием в пространстве имен std.

Смежные вопросы