2012-06-20 36 views
26
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%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ù formatlocalDate 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?

+0

Ngoại lệ là gì? – ronag

+0

'throw std :: runtime_error (" Lỗi phân tích cú pháp ");' – tauran

+1

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. –

Trả lời

1

Tôi thấy có cuộc gọi đến local_time. Tôi không chắc chắn nếu mã cơ bản gọi localtime hoặc localtime_r. Nếu nó gọi localtime, thì nó không phải là thread an toàn. Tôi tin rằng localtime sử dụng một biến tĩnh khi nó trả về kết quả.

Các vấn đề liên quan