代碼 (Ada)4. TASK LIFE SPANS

練習(xí)一 Scope

任何task都要在他的子任務(wù)結(jié)束后才能結(jié)束。
對(duì)于以下的程序 請(qǐng)給出輸出順序

with Ada.Calendar;      use Ada.Calendar;
with Ada.Float_Text_IO; use Ada.Float_Text_IO;
with Ada.Text_IO;       use Ada.Text_IO;

procedure Task_Scopes is

   Start_Up_Time : constant Time := Clock;

   procedure Put_Line_Time (S : String) is

   begin
      -- Prefixes the time since startup as seconds with two decimal places
      Put (Float (Clock - Start_Up_Time), 1, 2, 0); Put_Line (" seconds: " & S);
   end Put_Line_Time;

   task type Outer_Type;
   type Outer_Type_Ptr is access Outer_Type;
   task body Outer_Type is

   begin
      delay 0.6; Put_Line_Time ("-- End of an outer task");
   end Outer_Type;

   task Static_Outer_Task;
   task body Static_Outer_Task is

   begin
      delay 0.1; Put_Line_Time ("Start of Static_Outer_Task");
      declare

         task type Inner_Type;
         type Inner_Type_Ptr is access Inner_Type;
         task body Inner_Type is

         begin
            delay 0.6; Put_Line_Time ("-- End of an inner task");
         end Inner_Type;

         task Static_Inner_Task;
         task body Static_Inner_Task is

         begin
            delay 0.2; Put_Line_Time ("Start of Static_Inner_Task");
            declare
               Inner_Task_Instance : Inner_Type;
               Outer_Task_Instance : Outer_Type;
               Dynamic_Inner_Instance : Inner_Type_Ptr := new Inner_Type;
--                 Dynamic_Outer_Instance : Outer_Type_Ptr := new Outer_Type;
            begin
               delay 0.3; Put_Line_Time ("End of Static_Inner_Task declare block");
            end;
            delay 0.1; Put_Line_Time ("End of Static_Inner_Task");
         end Static_Inner_Task;

      begin
         delay 0.4; Put_Line_Time ("End of Static_Outer_Task declare block");
      end;
      delay 0.1; Put_Line_Time ("End of Static_Outer_Task");
   end Static_Outer_Task;

begin
   delay 0.2; Put_Line_Time ("Start of main scope");
   delay 0.2; Put_Line_Time ("End of main scope");
end Task_Scopes;

運(yùn)行結(jié)果:

分析:Ada中有兩個(gè)種類的task

  1. static
    這一類都是直接在聲明然后使用。他的存活范圍為生成task時(shí)所在的范圍(scope)往核。
  2. dynamic
    這一類就使用access關(guān)鍵字來(lái)表示(指針):

聲明:

type Outer_Type_Ptr is access Outer_Type;

實(shí)例化:

Dynamic_Outer_Instance : Outer_Type_Ptr := new Outer_Type;

這一類的存活范圍為其原task聲明所在的范圍箫爷,即與其在哪里被生成無(wú)關(guān)。
之所以用到了指針而不用重新聲明一個(gè)新的task聂儒,主要是考慮到了存儲(chǔ)空間的問(wèn)題虎锚。

最后,散亂分布的相同的dynamic task會(huì)被同一個(gè)task 回收衩婚,這是最有利的一點(diǎn)窜护。

練習(xí)二 Concurrent Mergesort

實(shí)現(xiàn)一個(gè)concurrent mergesort。

with Ada.Exceptions; use Ada.Exceptions;
with Ada.Text_IO;    use Ada.Text_IO;
with CPU_Counter;    use CPU_Counter;

procedure Concurrent_Mergesort (Sort_Field : in out Element_Array) is

   procedure Mergesort (F : in out Element_Array) is

   begin
      if F'Length > 1 then
         declare
            Middle : constant Index := Index'Val (Index'Pos (F'First) + F'Length / 2);

            subtype Low_Range  is Index range F'First .. Index'Pred (Middle);
            subtype High_Range is Index range Middle  .. F'Last;

            F_Low  : aliased Element_Array := F (Low_Range);
            F_High : aliased Element_Array := F (High_Range);

            Gained_Agent : Boolean := False;
                    
         begin
            if CPUs_Potentially_Available then
               CPU_Count.Try_Check_One_Out (Gained_Agent);
            end if;

            if Gained_Agent then   ## 關(guān)鍵部分
               declare
                  task sort_L;
                  
                  task body sort_L is 
                  begin                      
                     Mergesort (F_Low);
                  end;
                  
                  task  sort_H;           
                  
                  task body sort_H is 
                  begin
                     Mergesort (F_High);
                  end;
                  
               begin
                  null;
               end;                ##關(guān)鍵部分
               
            else
               Mergesort (F_Low);
               Mergesort (F_High);
            end if;

            declare
               Low          : Low_Range  := Low_Range'First;
               High         : High_Range := High_Range'First;
               Low_Element  : Element    := F_Low  (Low);
               High_Element : Element    := F_High (High);

            begin
               Merge : for i in F'Range loop

                  if Low_Element < High_Element then
                     F (i) := Low_Element;
                     if Low = F_Low'Last then
                        F (Index'Succ (i) .. F'Last) := F_High (High .. F_High'Last);
                        exit Merge;
                     else
                        Low  := Index'Succ (Low); Low_Element  := F_Low (Low);
                     end if;
                  else
                     F (i) := High_Element;
                     if High = F_High'Last then
                        F (Index'Succ (i) .. F'Last) := F_Low (Low .. F_Low'Last);
                        exit Merge;
                     else
                        High := Index'Succ (High); High_Element := F_High (High);
                     end if;
                  end if;
               end loop Merge;
            end;
         end;
      end if;
   end Mergesort;

begin
   Mergesort (Sort_Field);
end Concurrent_Mergesort;

在以上關(guān)鍵部分非春,我用了兩個(gè)并行的task 代替了原來(lái)順序執(zhí)行的 Mergesort (F_Low), Mergesort (F_High);
因?yàn)閙ergesort的關(guān)鍵就是separation柱徙,其中的順序執(zhí)行就在于其中一組已經(jīng)排列好了,而等待下一組的排列奇昙。所以我們做的就是讓他們同時(shí)進(jìn)行护侮。

效果:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市储耐,隨后出現(xiàn)的幾起案子羊初,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,657評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件长赞,死亡現(xiàn)場(chǎng)離奇詭異晦攒,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)得哆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,662評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)脯颜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人贩据,你說(shuō)我怎么就攤上這事栋操。” “怎么了乐设?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,143評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵讼庇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我近尚,道長(zhǎng),這世上最難降的妖魔是什么场勤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,732評(píng)論 1 284
  • 正文 為了忘掉前任戈锻,我火速辦了婚禮,結(jié)果婚禮上和媳,老公的妹妹穿的比我還像新娘格遭。我一直安慰自己,他們只是感情好留瞳,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,837評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布拒迅。 她就那樣靜靜地躺著,像睡著了一般她倘。 火紅的嫁衣襯著肌膚如雪璧微。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 50,036評(píng)論 1 291
  • 那天硬梁,我揣著相機(jī)與錄音前硫,去河邊找鬼。 笑死荧止,一個(gè)胖子當(dāng)著我的面吹牛屹电,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播跃巡,決...
    沈念sama閱讀 39,126評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼危号,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了素邪?” 一聲冷哼從身側(cè)響起外莲,我...
    開(kāi)封第一講書(shū)人閱讀 37,868評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娘香,沒(méi)想到半個(gè)月后苍狰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體办龄,經(jīng)...
    沈念sama閱讀 44,315評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,641評(píng)論 2 327
  • 正文 我和宋清朗相戀三年淋昭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俐填。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,773評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡翔忽,死狀恐怖英融,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歇式,我是刑警寧澤驶悟,帶...
    沈念sama閱讀 34,470評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站材失,受9級(jí)特大地震影響痕鳍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜龙巨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,126評(píng)論 3 317
  • 文/蒙蒙 一笼呆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旨别,春花似錦诗赌、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,859評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至递览,卻和暖如春叼屠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背非迹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,095評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工环鲤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人憎兽。 一個(gè)月前我還...
    沈念sama閱讀 46,584評(píng)論 2 362
  • 正文 我出身青樓冷离,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親纯命。 傳聞我的和親對(duì)象是個(gè)殘疾皇子西剥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,676評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 很實(shí)用的編程英語(yǔ)詞庫(kù),共收錄一千五百余條詞匯亿汞。 第一部分: application 應(yīng)用程式 應(yīng)用瞭空、應(yīng)用程序app...
    春天的蜜蜂閱讀 1,341評(píng)論 0 22
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器咆畏,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,513評(píng)論 1 51
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法南捂,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法旧找,繼承相關(guān)的語(yǔ)法溺健,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,602評(píng)論 18 399
  • 第五十九天 今天去把一直想做的事兒做了钮蛛,報(bào)了名以后就要好好堅(jiān)持下去鞭缭。 今天晚上要做的最要緊的事情是把這周的工作、生...
    云小5閱讀 129評(píng)論 0 0