J'écris une bibliothèque de transactions simultanées dans C et trouve le problème suivant. Considérons un membre de transaction échantillon pseudo-code, où la « transaction » représente un canal de communication avec le maître de la transaction:Comment simuler des exceptions en C avec goto?
transaction = trans_join();
do_some_ops();
/* receive the data from the master */
trans_rcv(transaction, data);
do_some_ops();
trans_send(transaction, answer);
/* wait for the possibility for voting */
trans_ready(transaction);
/* vote for commiting and wait for the voting results. */
if(trans_commit(answer))
{
printf("Final commiting the changes.\n");
}
else
{
printf("Rolling back the changes.\n");
}
Dans les transactions simultanées, nous pouvons voter que si on nous demande le vote par le maître. Toutefois, le maître peut appeler trans_abort(member)
à tout moment, ce qui oblige le membre spécifié à annuler la transaction. Le message ABORT peut être reçu par le membre à n'importe quel stade d'exécution et dans ce cas, il ne doit pas attendre que l'exécution atteigne l'appel trans_ready()
. Par exemple, s'il y a un appel trans_rcv()
dans le code suivant, le processus attendrait les données du maître qui ne seront jamais envoyées.
Maintenant, le point. J'ai déjà le code pour enregistrer la fonction d'annulation qui annule les changements, mais j'aimerais aussi avoir un mécanisme supplémentaire qui permettrait d'ignorer le reste des opérations restantes et de passer directement au code de vote. J'ai une idée d'utiliser goto ici pour simuler des exceptions:
if(!trans_rcv()) /* fail, we received the abort message */
{
goto abort_code;
}
...
abort_code:
trans_ready(transaction);
/* etc. */
Cependant, l'écriture ifs pour chaque appel de trans_rcv
ou trans_send
n'est pas très confortable, surtout si le code de transaction est complexe. Avez-vous une idée d'une meilleure solution ou est-ce le seul moyen? Il n'a pas à utiliser goto
, en passant :).
Voyons combien de personnes viendront avec quelque chose comme "goto? AAAAAAAAAAAAARGH": P –
goto? AAAAAAAAAAAAARGH –