boost::asio
とというオブジェクトを使用してスレッドプールを実装しました。boost::asio::io_service::run()
を呼び出しています。しかし、私が与えられた要件は、すべてのスレッドを監視して "正常性"を確認する方法です。私の目的は、スレッドプールを通過できる単純なセンチネルオブジェクトを作成することです。スレッドが完了すると、そのスレッドはまだ処理中であるとみなすことができます。boost :: asio、スレッドプールとスレッドの監視
しかし、私の実装を考えると、私は(あれば)、私は確実に、プール内のすべてのスレッドを監視することができますかどうかはわかりません。私は単純にそう実際にそのセンチネルを取得し、作業を行いますどのスレッド保証するものではありませんio_service
インスタンスにセンチネルオブジェクトを掲示、boost::asio::io_service::run()
にスレッド機能を委任しました。
1つのオプションは、単に定期的にセンチネルを挿入し、それが少なくとも一度は時間のいくつかの合理的な量で、各スレッドによってピックアップされることを願っていますが、それは明らかに理想的ではありませんすることであってもよいです。
は、次の例を見てみましょう。原因ハンドラがコード化される方法に、この例では、我々は、各スレッドが同じ作業量を尽くすことがわかりますが、実際には、私はハンドラ実装のコントロールを持っていない、他の人がほとんどだろうしながら、いくつかは、長時間実行することができます即時。
#include <iostream>
#include <boost/asio.hpp>
#include <vector>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
void handler()
{
std::cout << boost::this_thread::get_id() << "\n";
boost::this_thread::sleep(boost::posix_time::milliseconds(100));
}
int main(int argc, char **argv)
{
boost::asio::io_service svc(3);
std::unique_ptr<boost::asio::io_service::work> work(new boost::asio::io_service::work(svc));
boost::thread one(boost::bind(&boost::asio::io_service::run, &svc));
boost::thread two(boost::bind(&boost::asio::io_service::run, &svc));
boost::thread three(boost::bind(&boost::asio::io_service::run, &svc));
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
svc.post(handler);
work.reset();
three.join();
two.join();
one.join();
return 0;
}
@Chadの回答にコードを追加できますか? –
完了。それに対するフィードバックがあれば幸いです。 – Chad