Ada保护类型



我在Ada中有一个简单的包,包含过程和函数。我希望所有的函数和过程都是受保护的类型。

例如,对于简单的.adb文件

package body Pack is
  procedure procedure1 (B : in out Integer) is
  begin
    B := new Integer;
  end procedure1;
  procedure procedure2 (B: in out Integer) is
  begin
    B.Cont(B.First-1) := 1;
  end procedure2;
  function procedure3 (B : Integer) return Boolean is
  begin
    return B.First = B.Last;
  end procedure3;
end pack;

和或一个简单的.ads

package body Pack is
   procedure procedure1 (B : in out Integer);
   procedure procedure2 (B: in out Integer);
   function procedure3 (B : Integer) return Boolean;
end pack;

我该怎么做?

受保护类型的作用是保护某些东西(防止并发访问)。从你的代码中很难看出你想要保护的是什么。

比如说,如果你想进行线程安全增量,你可能有一个类似的规范

package Pack is
   protected type T is
      procedure Set (To : Integer);
      procedure Increment (By : Integer);
      function Get return Integer;
   private
      Value : Integer := 0;
   end T;
end Pack;

(这远非完美;您希望能够在声明T时指定初始Value,但这开始变得复杂起来)。

在这种情况下,需要保护的是Value。您需要确保,如果两个任务同时调用Increment,一个调用By => 3,一个使用By => 4,则Value最终会增加7。

尸体可能看起来像

package body Pack is
   protected body T is
      procedure Set (To : Integer) is
      begin
         Value := To;
      end Set;
      procedure Increment (By : Integer) is
      begin
         Value := Value + By;
      end Increment;
      function Get return Integer is
      begin
         return Value;
      end Get;
   end T;
end Pack;

推荐阅读:关于受保护类型的Wikibooks部分。

最新更新