簡體   English   中英

關於受保護對象的Ada通用包的新手問題[暫停]

[英]Newbie question on Ada generic package with a protected object [on hold]

我還在學習使用這種語言,所以這些都是新手問題,我希望這些問題對其他人也有用:

在來自rmit.edu.au的Dale Stanbrough的一個例子中: Link

generic
    type Item is private;
    Maximum_Buffer_Size : in Positive;
package Bounded_Buffer_Package is
   subtype Buffer_Index is Positive range 1..Maximum_Buffer_Size;
   subtype Buffer_Count is Natural  range 0..Maximum_Buffer_Size;
   type    Buffer_Array is array (Buffer_Index) of Item;

   protected type Bounded_Buffer is
      entry Get (X : out Item);
      entry Put (X : in Item);
   private
      Get_Index : Buffer_Index := 1;
      Put_Index : Buffer_Index := 1;
      Count     : Buffer_Count := 0;
      Data      : Buffer_Array;
   end Bounded_Buffer;
end Bounded_Buffer_Package;

-------------------------------------------------------------

package body Bounded_Buffer_Package is
   protected body Bounded_Buffer is
       entry Get (X : out Item) when Count > 0 is
       begin
           X := Data(Get_Index);
           Get_Index := (Get_Index mod Maximum_Buffer_Size) + 1;
           Count := Count - 1;
      end Get;

      entry Put (X : in Item) when Count < Maximum_Buffer_Size is
      begin
          Data(Put_Index) := X;
          Put_Index  := (Put_Index mod Maximum_Buffer_Size) + 1;
          Count := Count + 1;
      end Put;

    end Bounded_Buffer;
end Bounded_Buffer_Package;

我用過如下包:

with Text_IO; use Text_IO;
with Bounded_Buffer_Package;  

procedure test_buffer is
    package my_buffer_instance is new Bounded_Buffer_Package(Item => Integer, Maximum_Buffer_Size =>100);
    my_buffer : my_buffer_instance.Bounded_Buffer;
    val : Integer;
begin
    my_buffer.Put(17);
    my_buffer.Get(val);
    Put_line(Integer'Image(val));
end test_buffer;

====編輯===

代碼有效,但我有以下問題:

這是使用受保護對象的通用包的正確方法嗎? 如果沒有,實例化有界緩沖區對象的正確方法是什么?

===編輯2 - 澄清===

我想問的是:我是否無意中兩次分配所有數據(包括可能很大的緩沖區)? 一旦進入包my_buffer_instance的實例化,第二次進入my_buffer定義?

我的理解是new Bounded_Buffer_Package只定義了類型Bounded_Buffer但是在類型使用正確之前不分配內存?

我不禁感覺到Bounded_Buffer_Package (順便說一下,為什么要添加_Package ?只需添​​加另外8個字符讓眼睛跳過)可以用更多的信息隱藏! 用戶無需了解PO內部使用的類型和子類型。

這不是你的問題的重點。 當聲明受保護對象時,緩沖區確實被保留; 通用實例化可以保留幾個字節(例如,與精化檢查有關)但不保留緩沖區。

聲明對象而不是類型的泛型肯定會在實例化時為該對象保留空間。

受保護對象旨在用作任務之間的共享數據。 您的示例主要任務是調用put和get。 受保護對象的預期用途應該至少有一個任務作為生產者,調用Put條目,以及一個或多個作為消費者的任務,調用Get條目。 受保護對象將為您處理所有鎖定和任務排隊問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM