2011-10-28 9 views
6

Tengo un problema con la biblioteca de impulso. Estoy utilizando MinGW con gcc 4.5.2 para compilar el código siguiente:Aumento de ptime en MinGW no es seguro para roscas

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

El problema es que este código no es seguro para subprocesos. Cuando lo ejecuto desde múltiples hilos, mi aplicación falla. Por ahora, me he convertido en funciones c-standard como time, mktime, etc. y todo funciona bien, pero en el futuro necesitaré algunas funciones de tiempo de impulso.

Estaba compilando también con -D_REENTRANT, pero esto no ayudó.

Gracias por cualquier sugerencia.

+0

¿compiló todo con '-mthreads' también? – rubenvb

+0

Lo intenté pero sin resultados. – kappa

+0

Puedes envolverlo en un mutex si el rendimiento no es demasiado grande. – sje397

Respuesta

2

Compruebe si su código está llamando a gmtime() o gmtime_r() (use un depurador para esto). Consulte http://www.boost.org/doc/libs/1_48_0/boost/date_time/c_time.hpp y tenga en cuenta que BOOST_DATE_TIME_HAS_REENTRANT_STD_FUNCTIONS se debe definir para que el tiempo sea seguro para subprocesos.

+0

Es realmente triste/malo que la implementación no use 'localtime_s' y' gmtime_s' en Visual Studio ... – dalle

+0

@dalle: No sé mucho acerca de la programación de Windows, pero es interesante que incluso vayan al problema para deshabilitar las advertencias del compilador para usar las funciones que no son _s. ¿Por qué no envía un parche, o al menos propone el cambio en la lista de correo de Boost? –

+1

Al observar el código, las funciones regulares 'localtime' y' gmtime' son seguras para hilos utilizando las bibliotecas CRT de Visual Studio. No son reentrantes, pero cada subproceso usa su propio buffer interno 'struct tm'. – dalle

Cuestiones relacionadas