c/c++语言开发共享如何使用goto模拟C中的exception?

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

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()调用,则进程将在等待来自主服务器的数据时挂起,该数据将永远不会被发送。

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

 if(!trans_rcv()) /* fail, we received the abort message */ { goto abort_code; } ... abort_code: trans_ready(transaction); /* etc. */ 

但是,为trans_rcvtrans_send每次调用写ifs trans_send是很舒服,特别是如果事务代码很复杂的话。 您是否有任何想法可以获得更好的解决方案,或者这是唯一的方法吗? 顺便说一句,它不必使用goto :)。

    如果键入IF是问题,您可以使用宏,如:

     #define trans_rcv_CHK do {  if (!trans_rcv())  {  goto abort_code;  }  } while(0) 

    如果trans_rcv有参数,这应该有效(至少在gcc中):

     #define trans_rcv_CHK(...) do {  if (!trans_rcv(__VA_ARGS__))  {  goto abort_code;  }  } while (0) 

    goto只在一个函数内部工作,这可能是对exception机制的一个限制。

    我建议使用setjmp / longjmp函数 – 有关详细信息,请参阅Wikipedia 。

    就个人而言,我会通过使用带有基于开关的状态机的while循环对其进行编码。

    C中exception处理的最佳来源之一 。 基本上,RTOS的人们如何为他们的RTFile模块实现exception。 在文章的后半部分,要注意可怕的汇编语言。

    请参阅Hanson的“ C接口和实现:创建可重用软件的技术 ”。 它提供了一个基于setjmp()longjmp()的exception机制。 该代码可通过MIT许可证获得。

      以上就是c/c++开发分享如何使用goto模拟C中的exception?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/523110.html

      (0)
      上一篇 2020年12月11日
      下一篇 2020年12月11日

      精彩推荐