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é?
¿Qué excepción? – ronag
'throw std :: runtime_error (" Error de análisis ");' – tauran
¿Está utilizando una biblioteca de tiempo de ejecución multiproceso? VisualStudio, por ejemplo, tiene dos: un solo subproceso y multihebra. –