English 中文(简体)
Ada Concurency
原标题:Issues in Ada Concurrency

我需要一些帮助和一些见解。 这是2005年阿达的一个方案,有3项任务。 产出为z。 如果这3项任务没有按其列入方案顺序进行,那么产出就会从z = 2, z = 1到 z = 0(在方案中很容易看出这一点),相互排斥的目的是确保产出为z = 2。

WITH Ada.Text_IO; USE Ada.Text_IO;
WITH Ada.Integer_Text_IO; USE Ada.Integer_Text_IO; 
WITH System; USE System;

procedure xyz is 
   x : Integer := 0; 
   y : Integer := 0; 
   z : Integer := 0;

   task task1 is
      pragma Priority(System.Default_Priority + 3);
   end task1;

   task task2 is
      pragma Priority(System.Default_Priority + 2);
   end task2;

   task task3 is
      pragma Priority(System.Default_Priority + 1);
   end task3;

   task body task1 is
   begin
      x := x + 1;
   end task1;

   task body task2 is
   begin
      y := x + y;
   end task2;

   task body task3 is
   begin
      z := x + y + z;
   end task3;

begin 
   Put(" z = ");
   Put(z); 
end xyz;

我第一次尝试了这一方案。

(a) 没有花钱,结果: 在100个工厂中,有2,86个,有1:10,有0:4个。

之后

(b) 体积,结果: 在100个工厂中,有2个:84个,有1个:14个,有0个:2个。

由于2个结果几乎相同,这些结果是意外的。 也就是说,产出具有相同的行为方式。

阿达齐格·古卢斯女士请就此专题作一些说明。 此外,还邀请(如果可能的话)使用白磷的其他解决办法。

此外,在我对关键进程(即我们与阿达所做的那样)的意见中,结果应当z到2,100%,因此,或在其他情况下,这一方案应该被称为85%的关键! (Ada不应如此)

问题回答

三个行动受到保护的物体可能照此办理。 但值得注意的是,所有这一切确实确保三个变数x、 y z与更新的顺序一致;这丝毫没有说明这一顺序。

   protected P is
      procedure Update_X;
      procedure Update_Y;
      procedure Update_Z;
      function Get_Z return Integer;
   private
      X : Integer := 0;
      Y : Integer := 0;
      Z : Integer := 0;
   end P;
   protected body P is
      procedure Update_X is
      begin
         X := X + 1;
      end Update_X;
      procedure Update_Y is
      begin
         Y := Y + X;
      end Update_Y;
      procedure Update_Z is
      begin
         Z := X + Y + Z;
      end Update_Z;
      function Get_Z return Integer is
      begin
         return Z;
      end Get_Z;
   end P;

另一方面,为了确保这三项任务“提交结果”,你可以改写P,要求说最新情况。 Y将封起来,直到更新X为止。 Get_ 兹现在必须成为具有参数的条目,而不是功能。

  protected P is
      entry Update_X;
      entry Update_Y;
      entry Update_Z;
      entry Get_Z (Result : out Integer);
   private
      X_Updated : Boolean := False;
      Y_Updated : Boolean := False;
      Z_Updated : Boolean := False;
      X : Integer := 0;
      Y : Integer := 0;
      Z : Integer := 0;
   end P;
   protected body P is
      entry Update_X when True is
      begin
         X := X + 1;
         X_Updated := True;
      end Update_X;
      entry Update_Y when X_Updated is
      begin
         Y := Y + X;
         Y_Updated := True;
      end Update_Y;
      entry Update_Z when Y_Updated is
      begin
         Z := X + Y + Z;
         Z_Updated := True;
      end Update_Z;
      entry Get_Z (Result : out Integer) when Z_Updated is
      begin
         Result := Z;
      end Get_Z;
   end P;

三项任务现在可以像你一样优先。 但是,在另外两人提出报告之前,“最新情况”的任务将受阻。

当然,这些花板只是把你系统的任务放在优先位置,不能保证对这些变量进行任何形式的相互排斥。

<可是足够一些系统。 然而,大多数阿达人执行这些日子将阿达任务描绘给联塞协调员办公室,大多数消费者日子有多个加工商,能够把他们的宇宙融为一体。 没有任何东西阻止本组织安排下个低优先工作,放在你第二任处理人身上,而最高优先工作已经展开。

该方案中的这种行为被称为“种族条件”。

如果你想要对这些变量进行相互总结,那么你需要加以落实。 要么将变数控制到一项任务中,要么使用斜体来从其他任务中加以修改,要么将其引入。 我建议后者,因为潜逃可能更难以获得权利。 然而,如果你想以具体方式发出呼吁,总控制员的任务,要求承担其他任务,可能是前进的道路。

这里是一项方案,是上述一系列变量! ......只有一项任务(如马克·C和T.E.D所建议的那样,如果我采用单一程序,则可以避免)

* A/63/150。

WITH Ada.Integer_Text_IO; USE Ada.Integer_Text_IO;

信息系统;

程序xyzsimple

x : Integer := 0; y : Integer := 0; z : Integer := 0;

任务类型xyz;

T: xyz;

任务机构xyz

开始

x:= x + 1;
y:= x + y;
z:= x + y + z;

端xyz;

开始 Put(" z = ");

Put(z);

终端Xyzsimple;

这一方案总能显示产出Z = 2,但后来却无法说明我试图做些什么。 这一方案是决定性的,没有纳入一致模式! 此外,该方案永远不会显示出T.E.D.提到的种族、肤色、世系或世系特征。





相关问题
Need help with web application settings [closed]

Pls give me the solutions for this two problem, which i was asked recently in interview. Prob1: Suppose I have application with 10 admin, so they can change the data anytime their having own userid ...

AutoResetEvent, ManualResetEvent vs Monitor

Lets say I have to orchestrate a synchronization algorithm in .Net 3.5 SP1 and any of the synchronization primitives listed in the title fit perfectly for the task. From a performance perspective, is ...

PHP and Concurrency

I ve been doing some web development work in PHP recently which has led me to study up on the language in general. So far I have not needed to use it to interact with a database, but I know it ...

UI And TcpClient Issue in vb.net

I m having some problems with a small ircbot i m writing. Basically I connect to the server using a tcpclient in a seperate class, which also runs on its own thread. I want to display the server text ...

Prevent Concurrent Editing of a List Item

In Sharepoint MOSS multiple users can edit the same item in a sharepoint list at the same time…the first person to save their edit “wins”. Is there a way to prevent this, to lock the list item while ...

How to properly catch RuntimeExceptions from Executors?

Say that I have the following code: ExecutorService executor = Executors.newSingleThreadExecutor(); executor.execute(myRunnable); Now, if myRunnable throws a RuntimeExcpetion, how can I catch it? ...

Concurrent modification whilst traversing a ruby Hash

Suppose you had this: def wipeProduct(hash, nameToDelete) hash.each do |i| key = i[0] productName = i[1].first hash.delete(key) if productName==nameToDelete end end I m not sure it ...

热门标签