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;
}
此函数应采用日期和格式字符串以及return 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 进行测试时,我发现我的代码中有很多部分会导致问题。例如,在调用一些 boost 日期时间转换函数时,我点击了 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<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;
}
但还是:为什么?