gpt4 book ai didi

c - 如何使用 goto 模拟 C 中的异常?

转载 作者:太空宇宙 更新时间:2023-11-04 05:01:50 26 4
gpt4 key购买 nike

我正在用 C 编写并发事务库,发现以下问题。让我们考虑一个示例事务成员伪代码,其中“事务”表示与事务主控的通信 channel :

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");
}

在并发事务中,只有当master要求我们投票时,我们才能投票。但是,主人可以随时调用trans_abort(member),强制指定的成员取消交易。成员可以在执行的任何阶段接收 ABORT 消息,在这种情况下,通常不应等到执行到达 trans_ready() 调用。例如,如果在后面的代码中有一个 trans_rcv() 调用,进程将挂起等待来自 master 的数据,该数据永远不会发送。

现在,重点。我已经有代码来注册回滚更改的中止函数,但我还想有一个额外的机制,允许跳过其余的操作并立即跳转到投票代码。我有一个想法在这里使用 goto 来模拟异常:

if(!trans_rcv()) /* fail, we received the abort message */
{
goto abort_code;
}

...

abort_code:
trans_ready(transaction);
/* etc. */

但是,为每次调用 trans_rcvtrans_send 编写 ifs 并不是很舒服,尤其是在事务代码很复杂的情况下。您是否有更好的解决方案的想法,或者这是唯一的方法?顺便说一下,它不必使用 goto :)。

最佳答案

goto 仅在一个函数内起作用,这可能是对异常机制的过多限制。

我建议使用 setjmp/longjmp 函数 - 参见 Wikipedia了解详情。

关于c - 如何使用 goto 模拟 C 中的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/943826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com