Ich habe eine Sequenz von geschachtelten asynchronen Operationen auf einem Asio :: IP :: tcp :: socket und ich möchte eine Möglichkeit haben, es so schnell wie möglich aus zu stoppen ein anderer Thread. Hier sind einige Pseudo:Abbrechen oder einfach ordnungsgemäß blockieren zukünftige asynchrone Operation auf dem Sockel
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
});
});
});
Das Problem ist, dass ein einfacher socket->cancel()
Anruf wird nicht immer funktionieren, da im Moment des Anrufs eines der Rückrufe ausgeführt werden kann. Es wird also keine Vorgänge in der Warteschlange geben, die abgebrochen werden, aber ein laufender Rückruf kann bald einen hinzufügen und die Sequenz fortsetzen. Ich möchte die asynchronen Operationen nach socket->cancel()
auch abgebrochen werden (sofort mit operation_aborted
Fehler abgeschlossen).
Die einzige Idee ist irgendwie in einem mutex.lock()
jeden Anruf zu wickeln und einen Aufhebungs-Flag schrecklich
//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();
Aber es sieht verwenden.
Haben über io_service::strand
gehört, aber nicht sicher, wie man es hier benutzt. Verwenden Sie .post() mit der socket->cancel()
Methode? Gibt es eine Garantie, dass die Situation {Callback, Cancel, Callback} unmöglich ist?
* "Ich würde einfach eine Aufgabe hinterlassen um die Steckdose zu schließen "* Ja, klingt wie, was ich brauche. Aber ist eine Situation {In-Strang-Callback endet, neue Daten kommen an den Socket, neue Callback-Enqueues an den Strang, der Closing-Thread enqueues close() -Methode} jetzt unmöglich? – Acuion
Ich bin verwirrt. Callbacks werden niemals "spontan in die Warteschlange gestellt", wenn Daten eintreffen. Lies Operationen _need_, um zuerst in diesem Bereich veröffentlicht zu werden. Ich bin mir nicht sicher, was Sie sonst noch fragen könnten. – sehe