star players mlb lineup game all c++ boost thread-safety gcc4 date-parsing

c++ - players - mlb all star game 2018 voting



c++ ¿Por qué mi fecha de análisis no es insegura? (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.

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 .

Ejemplo: 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 el format y el localDate son correctos y analizables (utilizo la misma fecha para cada llamada). Encontré algo sobre los problemas de hilos de std::stringstream / std::locale pero nada actualizado (estoy usando gcc 4.6.3 64bit).

Here alguien tiene el mismo problema:

Probando en los últimos días usando 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é?