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