私はこの質問をしましたが、何人かの人々がより多くの情報を求めました。だから私はより多くの情報を提供しています。
私はスマートカードとリーダーを持っています。ユーザーはいつでもリーダーからカードを取り外すことができます。スマート カードにはさまざまなブロック (16 バイト) があり、必要なブロックに書き込むことができます。
これで、スレッドとして実行される次の関数ができました。
3 void function (void *p)
4 {
5 if(smartCardRemoved)
6 doSmth();
7 else
8 {
9 // Smart card is inside the reader
10 writeDataToCard(handle, blockNr, data1);
11 blockNr++;
12 writeDataToCard(handle, blockNr, data2);
13 blockNr=12;
14 readDataFromCard(blockNr, credit);
15 credit--;
16 writeDataToCard(cardHandle, blockNr, credit);
}
}
data1
とdata2
は基本的にタイムスタンプでありcredit
、カードのクレジットです。今問題はです。ステップ 10 と 12 が実行されたとします。つまり、タイムスタンプがカードに書き込まれます。しかし今、ユーザーはリーダーからカードを取り外します - これは、ステップ 14、15、16 が実行されないことを意味します - タイムスタンプは書き込まれましたが、クレジットが減少しなかったため、これは私にとって問題です。これは私が言ったように問題です。したがって、ステップ 10 と 12 が実行された場合は、ステップ 14、15、および 16 も実行する必要があります。これに対処する方法は何ですか?
ps。確認する必要がありますが、単一のコミットですべてを書き込むことはできない場合があります。
pps。考えてみると、ステップ 12 が成功した場合、同様の問題が発生する可能性があると思いますが、ステップ 15 で例外がスローされるか、false が返されます。そのような場合はどうすればよいですか?
思慮深く慎重な回答をいただければ幸いです。ありがとうございました。