2009-06-03 9 views
0

私は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()コールがある場合、送信されないマスターからのデータを待つ際にプロセスがハングします。

今、ポイント。私はすでに変更をロールバックする中止機能を登録するコードをすでに持っていますが、残りの操作をスキップしてすぐに投票コードにジャンプできる特別な仕組みを持っていたいと思います。私は例外をシミュレートするために、ここではgotoを使用するためのアイデアを持っている:

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) 
+0

"goto?AAAAAAAAAAAARGH"のようなものが何人来るのでしょうか?P –

+0

goto? –

答えて

5

は、あなたは次のように、マクロを使用することができます個人的には、スイッチベースのステートマシンを使用してwhileループを使用してコード化します。

+1

マクロ...私はそれらを忘れてどのように奇妙な。前もって感謝します! – Zyx

+2

偽の間にifをラップするようにしてください。これは、最後にセミコロンでtrans_rcv_CHKを呼び出し、意図しない結果がないようにします。参照:http://c2.com/cgi/wiki/Wiki?TrivialDoWhileLoop –

+1

@sharth:良い点、ありがとう。私は答えにループを追加しました。 – tsg

3

のIFを入力すると、問題がある場合は

7

gotoは、1つの関数内でのみ機能します。これは、例外メカニズムの制限が大きすぎる可能性があります。

setjmp/longjmpの機能を使用することをお勧めします。詳しくは、Wikipediaを参照してください。

3

exception handling in Cのための最良のソースの1つです。基本的にRTOSの人々がRTFileモジュールの例外をどのように実装したか記事の後半を過ぎてアセンブリ言語への恐ろしいスリップに注意してください。

関連する問題