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

この関数の日付と書式文字列はreturn boost::posix_time::ptimeです。C++なぜ私の日付解析がスレッドセーフではないのですか?

例:2012:06:14 02:50:58および%Y:%m:%d %H:%M:%S

formatlocalDateは正確でパーサー可能ですが(私はすべての呼び出しで同じ日付を使用します)、マルチスレッドのプログラムで呼び出すと例外がスローされることがあります。 std::stringstream/std::localeスレッドに関する問題が見つかりましたが、最新のものはありません(gcc 4.6.3 64bitを使用しています)。

Here誰かが同じ問題があります。Valgrindの/ DRDを使用して、最後の数日間の

テストを、私は問題を引き起こす私のコードの多くの部分を発見しました。たとえば、いくつかのブースト日付時間変換関数を呼び出すとき、私は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; 
} 

しかし、それでもまだ:なぜ

は何の問題も与えないコードを更新しましたか?

+0

例外はありますか? – ronag

+0

'throw std :: runtime_error("解析エラー "); ' – tauran

+1

マルチスレッドのランタイムライブラリを使用していますか?たとえば、VisualStudioには2つのスレッドとマルチスレッドがあります。 –

答えて

1

私はlocal_timeの呼び出しがあります。基になるコードがlocaltimeまたはlocaltime_rを呼び出すかどうかはわかりません。 localtimeを呼び出すと、スレッドセーフではありません。私はlocaltimeが結果を返すときに静的変数を使用すると信じています。

関連する問題