2

N スレッドで実行されている boost::asio ベースのスレッド プールがあります。主に IO タスク (DB データの保存/検索) に使用されます。また、自己診断タイマー ジョブを起動して、プールが「ビジー」であるかどうかを確認します (「追加された時間」と「呼び出されたハンドラー」の間のミリ秒の差分を計算します)。負荷が非常に低く、プールがそれほど多くのスレッドを必要としない場合)。負荷が高い場合 (診断タスクによって決定)、新しいスレッドが追加されます。

_workers.emplace_back(srv::unique_ptr<srv::thread>(new srv::thread([this]
{
    _service.run();
})));

(srv 名前空間は、boost と std をすばやく切り替えるために使用されます)。これに対する解決策はありますか?

4

1 に答える 1

1

あなたが探しているのは、で待機しているスレッドに割り込むio_service方法です。例外を使用して、ある種の中断メカニズムを実装できます。

class worker_interrupted : public std::runtime_error
{
public:
    worker_interrupted() 
    : runtime_error("thread interrupted") {}
};


_workers.emplace_back(srv::unique_ptr<srv::thread>(new srv::thread([this]
{
    try
    {
        _service.run();
    }
    catch (const worker_interrupted& intrruption)
    {
        // thread function exits gracefully.
    }

})));

次に、例外io_service::postをスローするだけの完了ハンドラーをキューに入れるために使用できます。worker_interrupted

于 2018-05-14T20:00:18.767 に答える