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;
}
Chức năng này phải có ngày và chuỗi định dạng và return boost::posix_time::ptime
.C++ Tại sao phân tích ngày của tôi không phải là luồng an toàn?
Ví dụ: 2012:06:14 02:50:58
và %Y:%m:%d %H:%M:%S
.
Tuy nhiên nếu tôi gọi nó trong chương trình đa luồng, đôi khi ngoại lệ được ném, mặc dù format
và localDate
là chính xác và có thể phân tích được (tôi sử dụng cùng một ngày cho mọi cuộc gọi). Tôi đã tìm thấy một số vấn đề về các vấn đề về chủ đề std::stringstream
/std::locale
nhưng không có gì cập nhật (tôi đang sử dụng gcc 4.6.3 64bit).
Here ai đó có cùng một vấn đề:
kiểm tra trong vài ngày qua sử dụng Valgrind/DRD, tôi đã tìm thấy nhiều nơi trên mã của tôi mà gây ra vấn đề. Ví dụ: khi gọi một số hàm chuyển đổi thời gian tăng ngày, tôi nhấn std :: locale(), không phải là luồng an toàn.
đang cập nhật mà không đưa ra vấn đề:
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;
}
Nhưng vẫn: Tại sao?
Ngoại lệ là gì? – ronag
'throw std :: runtime_error (" Lỗi phân tích cú pháp ");' – tauran
Bạn có đang sử dụng thư viện thời gian chạy đa luồng không? VisualStudio ví dụ có hai - một luồng đơn và đa luồng. –