2011-10-28 8 views
6

Mam problem z biblioteki boost. Używam MinGW gcc 4.5.2 z skompilować następujący kod:Zwiększenie ptime pod MinGW nie wątku bezpieczne

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(); 
} 

Problemem jest to, że ten kod nie jest bezpieczny wątku. Gdy uruchomię go z wielu wątków, moja aplikacja ulega awarii. Na razie skonwertowałem do standardowych funkcji c, takich jak time, mktime itd. I wszystko działa dobrze, ale w przyszłości będę potrzebować kilku funkcji czasu doładowania.

Kompilowałem także z -D_REENTRANT, ale to nie pomogło.

Dzięki za wszelkie sugestie.

+0

czy skompilowałeś wszystko również z '-mthreads'? – rubenvb

+0

Próbowałem, ale bez wyników. – kappa

+0

Możesz zawinąć go w muteks, jeśli wydajność nie jest zbyt duża. – sje397

Odpowiedz

2

Sprawdź, czy twój kod wywołuje gmtime() lub gmtime_r() (użyj do tego debuggera). Zobacz http://www.boost.org/doc/libs/1_48_0/boost/date_time/c_time.hpp i pamiętaj, że BOOST_DATE_TIME_HAS_REENTRANT_STD_FUNCTIONS muszą być zdefiniowane, aby uzyskać czas na zabezpieczenie wątków.

+0

To naprawdę smutne/złe, że implementacja nie używa 'localtime_s' i' gmtime_s' w Visual Studio ... – dalle

+0

@dalle: Nie wiem zbyt wiele o programowaniu Windows, ale jest interesujące, że oni nawet idą do problem z wyłączaniem ostrzeżeń kompilatora w celu użycia funkcji innych niż _. Dlaczego nie przesyłasz łaty, a przynajmniej nie proponujesz zmiany na liście mailingowej Boost? –

+1

Patrząc na kod, regularne funkcje 'localtime' i' gmtime' są bezpieczne dla wątków za pomocą bibliotek Visual Studio CRT. Nie są one ciągłe, ale każdy wątek używa własnego wewnętrznego bufora 'struct tm'. – dalle

Powiązane problemy