我正在C编写一个并发事务库,并发现以下问题。让我们考虑一个样本交易员伪代码,其中“交易”代表与交易高手的通信信道:如何在C中模拟异常与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");
}
在并发事务,我们只可以投票,如果我们要求由主表决。但是,船长可以随时致电trans_abort(member)
,强制指定的成员取消交易。 ABORT消息可以在执行的任何阶段由成员接收,并且在这种情况下,不应该等到执行到达trans_ready()
呼叫。例如,如果在后面的代码中有一个trans_rcv()
调用,则该进程将在等待来自主服务器的数据时挂起,这将永远不会发送。
现在,重点。我已经有了注册中止函数的代码来回滚这些更改,但是我还希望有一个额外的机制可以跳过剩余的其余操作并立即跳转到投票代码。我有一个主意,用转到这里来模拟例外:
if(!trans_rcv()) /* fail, we received the abort message */
{
goto abort_code;
}
...
abort_code:
trans_ready(transaction);
/* etc. */
然而,对于trans_rcv
或trans_send
每次调用写IFS不是很舒服,特别是如果交易代码是复杂的。你有任何想法提供更好的解决方案,或者这是唯一的方法吗?顺便说一句:)它不必使用goto
。
让我们来看看有多少人会有像“goto?AAAAAAAAAAAAARGH”:P – 2009-06-03 09:30:45
goto? AAAAAAAAAAAAARGH – 2009-06-03 19:04:45