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;
}
Bu işlev, bir tarih ve bir biçim dizesi ve return boost::posix_time::ptime
almalıdır.C++ Tarih ayrıştırmam neden threadafe değil?
E.g .: 2012:06:14 02:50:58
ve %Y:%m:%d %H:%M:%S
.
Ancak, çok iş parçacıklı bir programda çağırırsam, bazen istisna atılır, ancak format
ve localDate
doğru ve ayrılabilir olsa da (her arama için aynı tarihi kullanıyorum). std::stringstream
/std::locale
iş parçacığı sorunları hakkında bir şey buldum ancak hiçbir şey güncel değil (gcc 4.6.3 64bit kullanıyorum).
Here birisi aynı sorun var: Valgrind/DRD kullanarak son birkaç gün içinde
hiç problem verirTest, ben sorunlara neden benim kod birçok yerinde bulduk. Örneğin, bazı yükseltme tarih zaman dönüştürme işlevleri çağrılırken, threadafe olmayan std :: locale() öğesini vurdum.
Güncelleme kod: hala
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;
}
Fakat: Neden?
Hangi özel durum? – ronag
'std :: runtime_error (" Ayrıştırma hatası "); – tauran
Çok iş parçacıklı bir çalışma zamanı kitaplığı kullanıyor musunuz? Örneğin VisualStudio'nun iki tane - bir tek dişli ve çok dişli vardır. –