C에서 동시 트랜잭션 라이브러리를 작성 중이며 다음 문제점을 발견했습니다. 의는 "트랜잭션"트랜잭션 마스터와 통신 채널을 나타내는 샘플 거래 회원의 의사 코드를 생각해 보자 : 우리는 마스터에 의해 투표를 요구하는 경우에만 동시 트랜잭션에서goto로 C에서 예외를 시뮬레이트하는 방법은 무엇입니까?
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
을 사용할 필요가 없습니다. :) trans_rcv 매개 변수가있는 경우
#define trans_rcv_CHK do { \
if (!trans_rcv()) \
{ \
goto abort_code; \
} \
} while(0)
, 이것은 (적어도, GCC의) 작동합니다 :
#define trans_rcv_CHK(...) do { \
if (!trans_rcv(__VA_ARGS__)) \
{ \
goto abort_code; \
} \
} while (0)
"goto? AAAAAAAAAAAARGH"와 같은 사람들이 몇 명이나 올지 알아 보겠습니다. P –
goto? –