とを使用して非同期で実行されるメンバー関数がありstd::future
ますstd::async
。場合によってはキャンセルする必要があります。(関数はオブジェクトの近くを連続してロードし、ロード中にオブジェクトが範囲外になることがあります。)同じ問題に対処するこの質問の回答をすでに読んでいますが、機能させることができません。
これは、私の実際のプログラムと同じ構造の単純化されたコードです。非同期の実行中に呼び出しStart()
を行うとKill()
、のアクセス違反が原因でクラッシュが発生しますinput
。
私の目には、コードは次のように機能するはずです。がKill()
呼び出されると、実行フラグは無効になります。次のコマンドget()
は、スレッドが終了するのを待つ必要があります。これは、実行中のフラグをチェックするため、すぐに終了します。スレッドがキャンセルされた後、input
ポインタは削除されます。
#include <vector>
#include <future>
using namespace std;
class Class
{
future<void> task;
bool running;
int *input;
vector<int> output;
void Function()
{
for(int i = 0; i < *input; ++i)
{
if(!running) return;
output.push_back(i);
}
}
void Start()
{
input = new int(42534);
running = true;
task = async(launch::async, &Class::Function, this);
}
void Kill()
{
running = false;
task.get();
delete input;
}
};
スレッドは実行中のフラグをfalseに切り替えることに気付いていないようです。私の間違いは何ですか?