1

非常に複雑なシナリオで使用しており、いくつかのワーカー スレッドが実行中でアイドル状態であるにも関わらずboost::asio、オブジェクトにポストされたメソッドが実行されないという問題が発生しています。boost::asio::io_service::strandio_service

私が言ったように、シナリオは非常に複雑です.私はまだかなり小さな再現シナリオを開発しようとしています. ただし、条件は次のとおりです。

  • 1 つの io_service が実行中で、作業オブジェクトが割り当てられています
  • 4 つのワーカー スレッドが io_service に割り当てられます (io_service::runそれぞれで呼び出されます)
  • 複数のストランド オブジェクトを使用して、多数の異なるタスクを投稿します
  • ストランドを介して実行される一部のタスクでは、新しいタスクがストランドにポストされます

システム全体は、1 つの状況を除いて、正常に安定して動作します。クラスの 1 つのデストラクタを呼び出すと、アボート ハンドラがストランドにポストされ (他のタスクと同期してアボートを開始するため)、アボートが完了するまで待機します。時折、アボート ハンドラが実行されないことが発生します (別のストランド オブジェクトの呼び出しからデストラクタが呼び出されます)。

問題は、ストランドがポストされたのと同じスレッドでハンドラーの実行を待機していることだと思います。そして、このスレッドは中止ハンドラが実行されるのを待っているため、プログラムはデッドロックします。

私の質問: - 私の仮定は正しいですか?- この状況を回避する方法はありますか? - その問題にどのように取り組みますか (いくつかの非同期タスクを実行していて、それらを同期的に中止する必要がある場合)

どうもありがとうございました。

メートル。

4

0 に答える 0