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
。
format
とlocalDate
は正確でパーサー可能ですが(私はすべての呼び出しで同じ日付を使用します)、マルチスレッドのプログラムで呼び出すと例外がスローされることがあります。 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; }
しかし、それでもまだ:なぜ
は何の問題も与えないコードを更新しましたか?
例外はありますか? – ronag
'throw std :: runtime_error("解析エラー "); ' – tauran
マルチスレッドのランタイムライブラリを使用していますか?たとえば、VisualStudioには2つのスレッドとマルチスレッドがあります。 –