4

プログラムでいくつかの問題が発生しています。

時間 (MINIMUM_WAIT) が経過するまでブロックされたままになる関数 (Take_Job) を呼び出すプロセスがあります。そうでない場合は、この状況を知らせるメッセージが表示されます。

for Printer_Id in Type_Printer_Id loop
   select
      delay MINIMUM_WAIT
      Pragma_Assert (True, "");
   then abort
      Take_Job (Controller,
                     Printer_Id,
                     Max_Tonner,
                     Job,
                     Change_Tonner);
      Pragma_Assert
        (False,
           "Testing of Take_Job hasn't been successful. It should have remained blocked.");
   end select;
end loop;

関数 Take_Job は、保護されたオブジェクトのエントリを呼び出します。

procedure Take_Job (R                 : in out Controller_Type;
                         Printer      : in     Type_Printer_Id;
                         Siz          : in     Typo_Volume;
                         Job          :    out Typo_Job;
                         Excep_Tonner :    out Boolean) is
begin
   R.Take_Job(Printer, Siz, Job, Excep_Tonner);
end Take_Job;

ここで、「R」は保護されたオブジェクトです。

次のコードは、保護されたオブジェクトのエントリです。実際には、エントリのパラメーターでいくつかのことを確認する必要があるため、「いつ」条件は True です。Ada ではそれが許可されていないため、保護されたオブジェクト内のパラメーターをコピーし、「遅延エントリ」を呼び出します。次に、「遅延エントリ」で、続行する前に条件が満たされていることを確認します。

entry Take_Job(Printer_Id: in Type_Printer_Id; Remaining: in Type_Volume; Job: out Type_Job; exceptionTonner: out Boolean)
when True is
begin
   Copy_Remaining(Printer_Id) := Remaining;
   requeue Take_Job_Delayed(Printer_Id);
end Take_Job;

「遅延エントリ」コードを見てみましょう。

entry Take_Job_Delayed(for J in Type_Printer_Id)(Printer_Id: in Type_Printer_Id; Remaining: in Type_Volume; Job: out Type_Job; exceptionTonner: out Boolean)
when False is -- I've done this on purpose
begin
   null; -- Actually, there would be a lot of code here
end Take_Job_Delayed;

私の目標は、MINIMUM_WAIT を渡し、「Pragma_Assert(True, "")」を実行することだとしましょう。Take_Job の "when" 条件を "False" にすると、すべて正常に動作します。Take_Job は受け入れられず、Pragma_Assert が実行されます。これを「True」に設定し、Take_Job_Delayed の「when」条件を「False」に設定すると、同じ効果が得られず、プロセスがブロックされ、Pragma_Assert のいずれも実行されません。

なんで?問題は「リキュー」またはその近くにあるようですが、なぜこれが起こっているのですか?

4

1 に答える 1

5
于 2014-02-20T15:02:42.620 に答える