2011-10-28 5 views
6

私はブーストライブラリに問題があります。MinGWの下でのptimeをスレッドセーフではない

unsigned long GetEpochSeconds() 
{ 
    using namespace boost::posix_time; 
    using namespace boost::gregorian; 

    ptime now(second_clock::universal_time()); 
    ptime epoch(date(1970,1,1)); 
    time_duration diff = now-epoch; 
    return diff.total_seconds(); 
} 

問題は、このコードはスレッドセーフではないということです:私は、次のコードをコンパイルするためのgcc 4.5.2でのMinGWを使用しています。複数のスレッド内から実行すると、アプリケーションがクラッシュします。今のところ、私はtime、mktimeなどのc標準関数に変換していますが、すべて正常に動作しますが、将来はいくつかのboost関数が必要になります。

私は-D_REENTRANTでもコンパイルしていましたが、これは役に立ちませんでした。

ありがとうございます。

+0

'-mthreads'ですべてをコンパイルしましたか? – rubenvb

+0

私は試みましたが、結果はありませんでした。 – kappa

+0

パフォーマンスヒットがあまり大きくない場合は、ミューテックスでラップすることができます。 – sje397

答えて

2

コードがgmtime()またはgmtime_r()を呼び出しているかどうかを確認します(デバッガを使用してください)。 http://www.boost.org/doc/libs/1_48_0/boost/date_time/c_time.hppを参照し、時間をスレッドセーフにするためにBOOST_DATE_TIME_HAS_REENTRANT_STD_FUNCTIONSを定義する必要があることに注意してください。

+0

Visual Studioで実装が 'localtime_s'と' gmtime_s'を使用していないのは本当に残念です/悪いです... – dalle

+0

@dalle:私はWindowsプログラミングについてよく知らないですが、非_s関数を使用するためにコンパイラの警告を無効にするという問題。なぜあなたはパッチを提出しないでください、あるいはBoostメーリングリストで少なくとも変更を提案してください。 –

+1

コードを見ると、通常の 'localtime'と' gmtime'関数はVisual Studio CRTライブラリを使ってスレッドセーフです。再入可能ではありませんが、各スレッドは独自の 'struct tm'バッファを使用します。 – dalle

関連する問題