【问题标题】:Ada protected typesAda 保护类型
【发布时间】:2012-02-21 13:05:50
【问题描述】:

我在 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;

我该怎么做?

【问题讨论】:

  • 该代码距离编译还有很长的路要走。在procedure1 中,B 被声明为Integer,但您随后为其分配了访问值(new Integer)。而在另外两个子程序中,B 似乎是一个记录类型。并且保留字body 不能出现在包规范中。
  • 1> 这不是有效的 Ada 代码。 2>您是指并发中的受保护类型吗?如果是这样,请在此处阅读:en.wikipedia.org/wiki/…

标签: function ada procedure


【解决方案1】:

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

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

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 => 4Value 最终会增加 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 section

【讨论】:

  • + 1 以获得比我更好的链接 :)
  • 您甚至可以将受保护的对象隐藏在包体内,只需将包装子程序的规范保留在规范文件中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多