2011-10-28 20 views
6

Ho un problema con la libreria boost. Sto usando MinGW con gcc 4.5.2 per compilare il seguente codice:Aumentare ptime in MinGW non thread safe

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

Il problema è che questo codice non è thread-safe. Quando lo eseguo da più thread, la mia applicazione si blocca. Per ora mi sono convertito in funzioni c-standard come time, mktime ecc. E tutto funziona bene, ma in futuro avrò bisogno di alcune funzioni di boost.

Stavo compilando anche con -D_REENTRANT, ma questo non ha aiutato.

Grazie per eventuali suggerimenti.

+0

hai compilato anche tutto con '-mthreads'? – rubenvb

+0

Ho provato ma senza risultati. – kappa

+0

È possibile eseguire il wrapping in un mutex se il rendimento non è eccessivo. – sje397

risposta

2

Controlla se il tuo codice chiama gmtime() o gmtime_r() (usa un debugger per questo). Vedere http://www.boost.org/doc/libs/1_48_0/boost/date_time/c_time.hpp e notare che BOOST_DATE_TIME_HAS_REENTRANT_STD_FUNCTIONS deve essere definito in modo da ottenere il tempo per essere thread-safe.

+0

È davvero triste/cattivo che l'implementazione non utilizzi 'localtime_s' e' gmtime_s' in Visual Studio ... – dalle

+0

@dalle: non so molto sulla programmazione di Windows, ma è interessante che vadano anche a problemi di disabilitazione degli avvisi del compilatore per utilizzare le funzioni non _s. Perché non invii una patch, o almeno proponi la modifica sulla mailing list di Boost? –

+1

Guardando il codice le normali funzioni 'localtime' e' gmtime' sono filettate usando le librerie CRT di Visual Studio. Non sono rientranti, ma ogni thread usa il proprio buffer interno 'struct tm'. – dalle