Увеличить ptime под MinGW не потокобезопасно

#c #boost #mingw

#c #повышение #mingw

Вопрос:

У меня проблема с библиотекой boost. Я использую MinGW с gcc 4.5.2 для компиляции следующего кода:

 unsigned long GetEpochSeconds()
{
    using namespace boost::posix_time;
    using namespace boost::gregorian;

    ptime now(second_clock::universal_time());
    ptime epoch(date(1970,1,1));
    time_duration diff = now-epoch;
    return diff.total_seconds();
}
 

Проблема в том, что этот код не является потокобезопасным. Когда я запускаю его из нескольких потоков, мое приложение выходит из строя. На данный момент я перешел на стандартные функции c, такие как time, mktime и т. Д., И Все работает нормально, Но в будущем мне понадобится несколько функций повышения времени.

Я также компилировал с помощью -D_REENTRANT , но это не помогло.

Спасибо за любые предложения.

Комментарии:

1. вы -mthreads также скомпилировали все с помощью?

2. Вы можете обернуть его в мьютекс, если снижение производительности не слишком велико.

3. Можете ли вы сузить свой пример и показать полный код, который вызывает сбой? Кроме того, какой сбой? Где это происходит?

4. 1. Спасибо за публикацию этого. Возможно, вы захотите сообщить о повышении 🙂

5. Это затрагивает не только MinGW, даже сборки Visual Studio, поскольку localtime_r и gmtime_r не поддерживается. В Visual Studio localtime_s gmtime_s можно было бы использовать функции и, но это не так.

Ответ №1:

Проверьте, вызывает ли ваш код gmtime() или gmtime_r() (для этого используйте отладчик). См. http://www.boost.org/doc/libs/1_48_0/boost/date_time/c_time.hpp и обратите внимание, что BOOST_DATE_TIME_HAS_REENTRANT_STD_FUNCTIONS должны быть определены для того, чтобы время было потокобезопасным.

Комментарии:

1. Действительно грустно / плохо, что реализация не использует localtime_s and gmtime_s в Visual Studio…

2. @dalle: Я не очень разбираюсь в программировании Windows, но интересно, что они даже сталкиваются с проблемой отключения предупреждений компилятора для использования функций, отличных от _s. Почему бы вам не отправить исправление или, по крайней мере, не предложить изменения в списке рассылки Boost?

3. Глядя на код, обычные localtime функции и gmtime функции являются потокобезопасными с использованием библиотек Visual Studio CRT. Они не являются реентерабельными, но каждый поток использует свой собственный внутренний struct tm буфер.

4. Я согласен. Тем не менее, некоторые люди могут предпочесть использовать _s-версии этих функций в Windows (опять же, я не эксперт в этом, я просто просматриваю документы MS).