c++ Почему мой анализ даты не является потокобезопасным?

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

Эта функция должна принимать дату и строку формата и возвращать boost::posix_time::ptime .

Например: 2012:06:14 02:50:58и %Y:%m:%d %H:%M:%S.

Однако, если я вызываю его в многопоточной программе, иногда возникает исключение, хотя formatи localDateкорректны и разборчивы (я использую одну и ту же дату для каждого вызова). Я нашел кое-что о проблемах потока std::stringstream/ std::locale, но ничего нового (я использую gcc 4.6.3 64bit).

Здесьу кого-то такая же проблема:

Тестируя последние несколько дней с использованием Valgrind/drd, я обнаружил, что многие части моего кода вызывают проблемы. Например, при вызове некоторых функций преобразования даты и времени я нажимаю std::locale(), который не является потокобезопасным.

Обновленный код, который не дает проблем:

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

Но все же: Почему?

26
задан tauran 20 June 2012 в 15:13
поделиться