Ada受保护的类型

sto*_*oud 1 procedure function 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;
Run Code Online (Sandbox Code Playgroud)

或者简单的.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;
Run Code Online (Sandbox Code Playgroud)

我该怎么办呢?

Sim*_*ght 6

关于受保护类型的事情是它保护某些东西(防止并发访问).从您的代码中很难看出您想要保护的是什么.

例如,如果你想做一个线程安全的增量,你可能会有一个类似的规范

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;
Run Code Online (Sandbox Code Playgroud)

(这远非完美;你希望能够Value在声明a时指定初始值T,但这开始变得复杂).

在这种情况下,要保护的是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;
Run Code Online (Sandbox Code Playgroud)

推荐阅读:受保护类型的Wikibooks部分.