asio :: ip :: tcp :: socketに一連のネストされた非同期操作があり、できるだけ速く停止させたい他のスレッド。ソケットの今後の非同期操作をキャンセルするか、適切にブロックする
socket->async_something(buffer, CallbackLambdaHeader
{
if (errorcode)
{
//exit the sequence
}
// some code
socket->async_something(buffer, CallbackLambdaHeader
{
if (errorcode)
{
//exit the sequence
}
// some code
socket->async_something(buffer, CallbackLambdaHeader
{
if (errorcode)
{
//exit the sequence
}
// etc
});
});
});
問題は、単純なsocket->cancel()
呼び出しは文句を言わない、常にコールバックのいずれかが実行されてコールの瞬間にために動作することです: は、ここではいくつかの疑似です。したがって、取り消すエンキューされた操作はありませんが、実行中のコールバックはすぐに追加してシーケンスを続行できます。 socket->cancel()
の後で非同期操作をキャンセルしたい場合もあります(瞬時にoperation_aborted
エラーで完了)。
唯一のアイデアは何とか
//thread1:
mutex.lock();
cancel = true;
socket->cancel();
mutex.unlock();
//thread 2:
mutex.lock();
if (!cancel)
{
socket->async_something(buffer, CallbackLambdaHeader
{
if (errorcode)
{
//exit the sequence
}
// some code
mutex.lock();
if (!cancel)
{
socket->async_something(buffer, CallbackLambdaHeader
{
if (errorcode)
{
//exit the sequence
}
// some code
mutex.lock();
if (!cancel)
{
socket->async_something(buffer, CallbackLambdaHeader
{
if (errorcode)
{
//exit the sequence
}
// etc
});
}
else
{
//exit the sequence
}
mutex.unlock();
});
}
else
{
//exit the sequence
}
mutex.unlock();
});
}
else
{
//exit the sequence
}
mutex.unlock();
をmutex.lock()
にすべての呼び出しをラップし、解除フラグを使用することです。しかし、それはひどい見えます。
io_service::strand
について聞いたことがありますが、ここでその使い方が分かりません。 socket->cancel()
メソッドで.post()を使用しますか?状況{コールバック、キャンセル、コールバック}が不可能であるという保証はありますか?
*「私は単純にタスクを投稿したいですソケットを閉じる "* はい、私は必要なもののように聞こえます。しかし、状況(インストランドコールバックが終了し、データの新しい部分がソケットに到着し、新しいコールバックがストランドにエンキューします。クローズスレッドはclose()メソッドをエンキューできません)。 – Acuion
私は混乱しています。コールバックは、データが到着したときに決して「自発的にエンキュー」しません。読み込み操作は、最初にそのストランドに投稿する必要があります。私は他にあなたが尋ねたいと思うことが分からない。 – sehe