3

Boost Threads ライブラリを使用して C++ で多数のスレッドを作成しました。これらすべてのスレッドをタイムアウトさせたいのですがtimed_join()、ループ内で使用できますが、合計待機時間 = スレッド数 * 時間 - になる可能性があります。アウトタイム。

for(int i = 0; i < number_of_threads; ++i)
{
   threads[i]->timed_join(boost::posix_time::seconds(timeout_time));
}

そこで、組み込みの posix_time クラスを使用して、各スレッドの期限を計算することを考えています。このようにして、合計待機時間は最大で指定されたタイムアウト時間になります。

これを行うための最も簡単で簡単な方法は何でしょうか?

4

2 に答える 2

7

thread::timed_join期間ではなく絶対時間(つまり、時点)がかかる過負荷を使用します。その絶対時間の期限を、現在の時間に必要なタイムアウト期間を加えたものにします。これによりthread::timed_join、ループ内のどの呼び出しも絶対時間の期限を過ぎて待機することがなくなります。

Boost.Threadの最新バージョン(Boost 1.50以降)では、Boost.Date_Timeは廃止され、Boost.Chronoが採用されました。これは、C++11のstd::threadのAPIとより厳密に一致させるためです。

この例は、Boost.ChronoまたはBoost.DateTimeのいずれかを使用して絶対時間の期限を指定する方法を示しています。

using namespace boost;

#if BOOST_VERSION < 105000

// Use of Boost.DateTime in Boost.Thread is deprecated as of 1.50
posix_time::ptime deadline =
    posix_time::microsec_clock::local_time() +
    posix_time::seconds(timeoutSeconds);

#else

chrono::system_clock::time_point deadline =
    chrono::system_clock::now() + chrono::seconds(timeoutSeconds);

#endif

for(int i = 0; i < number_of_threads; ++i)
{
    threads[i]->timed_join(deadline);
}

ドキュメントのこのページは、Boost.Date_Timeの使用例を示しています。

ドキュメントのこのページは、Boost.Chronoのチュートリアルです。

于 2012-08-01T01:22:55.813 に答える
0
int64_t mseconds = 60*1000; // 60 seconds

単に使用する

threads[i]->timed_join(boost::posix_time::milliseconds(mseconds ))

絶対時間を使う必要はありません

于 2013-11-20T19:46:07.083 に答える