これは、最小限の例で私の問題を示す C++ コードです。
// uncomment the next line, to make it hang up:
//#define BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG //needed for nanosecond support of boost
#include <boost/thread.hpp>
void foo()
{
while(true);
}
int main(int noParameters, char **parameterArray)
{
boost::thread MyThread(&foo);
if ( MyThread.timed_join( boost::posix_time::seconds(1) ) )
{
std::cout<<"\nDone!\n";
}
else
{
std::cerr<<"\nTimed out!\n";
}
}
ナノ秒のサポートをオンにしない限り、すべてが期待どおりに機能しますが、boost::posix_time でナノ秒のサポートに必要な #define のコメントを外すとすぐに、プログラムは if ステートメントを通過しなくなります。 timed_join() の代わりに join() を呼び出したかのように。
これは、BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG がタイムスタンプの実際のデータ表現を単一の 64 ビット整数から 64+32 ビットに変更するために発生することがわかっています。多くのブースト機能はヘッダー内に完全に実装されていますが、スレッド メソッドは実装されていません。そのため、適切なオプションを使用して再度コンパイルしないと、新しいデータ形式に適応できません。コードは外部サーバーで実行することを意図しているため、独自のバージョンのブーストをコンパイルすることはオプションではなく、ナノ秒のサポートをオフにすることもありません。
したがって、私の質問は次のとおりです: 互換性のない 96 ビットの posix_time メソッドを使用せず、標準のブースト パッケージを変更せずに、値 (秒単位) を timed_join() に渡す方法はありますか?
ブースト1.46.1を搭載したUbuntu 12.04で実行しています。