2012-06-20 13 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; 
} 

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

Test, 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.

hiç problem verir

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?

+0

Hangi özel durum? – ronag

+0

'std :: runtime_error (" Ayrıştırma hatası "); – tauran

+1

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

cevap

1

Görüyorum local_time için bir çağrı var. Temel kodun localtime veya localtime_r çağırdığından emin değilim. Yerel aramaları çağırırsa, o zaman iş parçacığı güvenli değildir. Sonuç döndürdüğünde, localtime statik bir değişken kullanır.

İlgili konular