2012-06-20 19 views
26
boost::posix_time::ptime parseDate(const std::string& format, const std::string& localDate) 
{ 
    std::istringstream is(localDate); 
    is.imbue(std::locale(is.getloc(), new boost::local_time::local_time_input_facet(format.c_str()))); 
    boost::posix_time::ptime pt; 
    is >> pt; 

    if (pt == boost::posix_time::ptime()) 
    { 
     throw std::runtime_error("Parse error"); 
    } 

    return pt; 
} 

Esta función debe tener una fecha y una cadena de formato y return boost::posix_time::ptime.C++ ¿Por qué mi fecha de análisis no es insegura?

Por ej .: 2012:06:14 02:50:58 y %Y:%m:%d %H:%M:%S.

Sin embargo, si lo llamo en un programa multiproceso, a veces se lanza la excepción, aunque format y localDate son correctos y analizables (utilizo la misma fecha para cada llamada). Encontré algo sobre std::stringstream/std::locale problemas de hilos pero nada actualizado (estoy usando gcc 4.6.3 64bit).

Here alguien tiene el mismo problema:

Pruebas en los últimos días utilizando Valgrind/DRD, he encontrado muchas partes de mi código que causan problemas. Por ejemplo, cuando llamo a algunas funciones de conversión de fecha y hora de impulso, pulso std :: locale(), que no es seguro para los hilos.

código actualizado que no da problemas:

boost::posix_time::ptime parseDate(const std::string& format, const std::string& localDate) 
{ 
    std::istringstream is(localDate); 
    auto* facet = new boost::local_time::local_time_input_facet(format.c_str()); 

    { 
     boost::unique_lock<boost::mutex> lock(globalLocaleMutex); 
     is.imbue(std::locale(is.getloc(), facet)); 
    } 

    boost::posix_time::ptime pt; 
    is >> pt; 

    if (pt == boost::posix_time::ptime()) 
    { 
     throw std::runtime_error("Parse error"); 
    } 

    return pt; 
} 

Pero aún así: ¿Por qué?

+0

¿Qué excepción? – ronag

+0

'throw std :: runtime_error (" Error de análisis ");' – tauran

+1

¿Está utilizando una biblioteca de tiempo de ejecución multiproceso? VisualStudio, por ejemplo, tiene dos: un solo subproceso y multihebra. –

Respuesta

1

Veo que hay una llamada a local_time. No estoy seguro si el código subyacente llama a localtime o localtime_r. Si llama a tiempo local, entonces no es seguro para subprocesos. Creo que localtime usa una variable estática cuando devuelve el resultado.

Cuestiones relacionadas