我在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部分。