国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      在構(gòu)件編程中自動生成Singleton模式的方法

      文檔序號:6563002閱讀:209來源:國知局
      專利名稱:在構(gòu)件編程中自動生成Singleton模式的方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及一種程序代碼的生成方法,特別涉及一種在構(gòu)件編程中自 動生成Singleton模式的方法。
      背景技術(shù)
      二十世紀八十年代以來,軟件編程技術(shù)有了很大的發(fā)展,其發(fā)展可以 大致分為以下幾個階段面向?qū)ο缶幊?,即通過對軟件模塊的封裝,使其相對獨立,從而使復(fù) 雜的問題簡單化。面向?qū)ο缶幊虖娬{(diào)的是對象的封裝,但模塊(對象)之 間的關(guān)系在編譯的時候已被固定,模塊之間的關(guān)系是靜態(tài)的,這種關(guān)系在程序運行時不能改變;也就是說在運行時不能換用模塊中更小的功能單元。面向構(gòu)件編程,即為了使不同軟件開發(fā)商提供的構(gòu)件模塊(軟件對象) 可以相互操作使用,構(gòu)件之間的連接和調(diào)用通過標準的協(xié)議來實現(xiàn)。構(gòu)件 化編程模型強調(diào)協(xié)議標準,需要提供各廠商都能遵守的協(xié)議體系。就像公 制螺絲的杏5準一樣,所有符合標準的嫘絲和嫘母都可以相互裝配。構(gòu)件化 編程模型建立在面向?qū)ο蠹夹g(shù)的基礎(chǔ)之上,是完全面向?qū)ο蟮?,提供了?態(tài)構(gòu)造部件模塊(在運行中可以構(gòu)造部件)的機制。構(gòu)件在運行時可以動 態(tài)裝入,是可以更換的。但是,現(xiàn)有的面向構(gòu)件編程技術(shù)要求用戶自行定 義構(gòu)件的非自描述接口,使得用戶程序的開發(fā)依然繁復(fù)。
      CAR (Component Assembly Runtime)構(gòu)件技術(shù)是一種面向構(gòu)件編程技術(shù),它定義了一套網(wǎng)絡(luò)編程時代的構(gòu)件編程模型和編程規(guī)范,它規(guī)定了 一組構(gòu)件間相互調(diào)用的標準,使得二進制構(gòu)件能夠自描述,能夠在運行時 動態(tài)鏈接。CAR與微軟的COM相比,刪除了COM中過時的約定,禁止用戶 定義COM的非自描述接口;完備了構(gòu)件及其接口的自描述功能,并且對用 戶界面進行了簡化包裝,易學(xué)易用。在一種嵌入式操作系統(tǒng)上,CAR構(gòu)件 技術(shù)由CAR語言(構(gòu)件描述語言,描述構(gòu)件的元數(shù)據(jù)信息)、CAR編譯器、 自動代碼生成工具以及CAR構(gòu)件基礎(chǔ)庫支持。CAR構(gòu)件技術(shù)體現(xiàn)了網(wǎng)絡(luò)編 程時代的特性,編程界面簡單。在嵌入式操作系統(tǒng)軟件開發(fā)工具包(SDK)的支持下,CAR技術(shù)使得 原來高深難懂的構(gòu)件編程技術(shù)很容易被0/0++程序員理解并掌握。用戶只 需要用腳本語言設(shè)計相關(guān)類和接口的關(guān)系以及其屬性,并存為.car文件, 通過CAR ^器的處理就可以自動生成相關(guān)的代碼。單例模式(Singleton模式)屬于設(shè)計模式中的--種方法,它的目的 是保證一個類僅有--個實例,并提供一個能夠訪問它的全局訪問點。這種 模式在實際開發(fā)中的應(yīng)用也非常多,例如在嵌入式圖形系統(tǒng)應(yīng)用中,由于 內(nèi)存資源比較寶貴,很多模塊都必須保證在整個過程中只能有一個實例。 在實際編程設(shè)計中,如果要運用該模式,用戶可以設(shè)計一個Singleton 的基類,然后在其子類實例中進行各種擴展來配置應(yīng)用,也可以直接設(shè)計 一個不允許繼承的Singleton類,里面包含了相關(guān)功能。無論采取哪種方 法,用戶都必須自行實現(xiàn)Singleton模式的相關(guān)代碼。如果能找到一種在 CAR構(gòu)件編程中自動生成singleton模式代碼的方法,將大大降低用戶編
      程的復(fù)雜程度??紤]一個銀行帳戶管理系統(tǒng),其中有上百萬個客戶帳號,要訪問每-個客戶的帳號,需要對客戶的權(quán)限進行驗證。在這樣的系統(tǒng)里,可以設(shè)計一個Singleton類叫做AccountManager,用來管理系統(tǒng)中的客戶帳戶,此類的實例在整個系統(tǒng)中只有一個,如果用Ctt實現(xiàn)的話,在多線程環(huán)境下,可以采用以下方法public s.ealed class AccountManager這個類的其他功能實現(xiàn)代碼……以下是singleton模式的實現(xiàn)代碼 static AccountManager instance_=null; static readonly object lock_ = new Object(): private AccountManager0public static AccountManager Instance getlock (lock—)if (instance—==null)instance— = new AccountManager 0; return instance ;
      以上是Singleton模式在Cft中的基本實現(xiàn),AccountManager類被設(shè) 計成不可繼承,當其靜態(tài)成員變量instance—為空時才在堆中進行類的初 始化,其他情況下直接返回該類的實例instance—的值,這樣就保證了系 統(tǒng)內(nèi)始終只有一個該類的實例,整個過程通過加鎖保證多線程下的-致 性。可以看到,不同的用戶和不同的語言對于Singleton模式的實現(xiàn)可能 不相同,但是都必須自己進行Singleton類的編寫,這樣用戶在實現(xiàn)類的 功能的同時,還必須花精力去實現(xiàn)singleton模式的相關(guān)代碼,這給用戶 的編程帶來一定的復(fù)雜度。發(fā)明內(nèi)容本發(fā)明的主要目的在于提供一種在構(gòu)件編程中自動生成Singleton模 式的方法,當編譯相應(yīng)car文件后就可自動生成實現(xiàn)此類Singleton的相關(guān) 代碼,而用戶只需要關(guān)注此構(gòu)件基本功能的實現(xiàn),大大降低了用戶編程的 負擔(dān)。為解決上述技術(shù)問題,本發(fā)明在構(gòu)件編程中自動生成Singleton模式的 方法,基于CAR構(gòu)件編程,包括以下步驟步驟一,定義一個全局對象變量, 并定義一個全局狀態(tài)值,同時定義一個全局鎖;步驟二,對狀態(tài)值加鎖; 步驟三,對全局狀態(tài)值進行檢測判斷,對對象進行初始化工作,并相應(yīng)地 設(shè)置全局狀態(tài)值為正在初始化;當全局狀態(tài)值為正在初始化時,表明已經(jīng) 有其他的線程進行對象的初始化工作,此時該線程將會進入等待狀態(tài),并
      且通過全局狀態(tài)值不斷檢測正在分配對象的線程的狀況;當全局狀態(tài)值為 己初始化時,獲得全局對象變量的值;步驟四,返回對象的值。本發(fā)明所提供的方法中,singleton的實現(xiàn)并非像Java或者.Net通 過繼承一個singleton基類來獲得相應(yīng)屬性,而是直接聲明為全局變量并 進行初始化,同時對其進行多線程同步管理,保證此全局變量只有一個實 例,當編譯相應(yīng)car文件后就可自動生成實現(xiàn)此類Singleton,大大降低 了用戶編程復(fù)雜程度。


      圖1是本發(fā)明的流程圖;圖2是屈1中全局狀態(tài)值為未初始化時的分支流程圖; 圖3是圖1中全局狀態(tài)值為正在初始化時的分支流程圖; 圖4圖1中全局狀態(tài)值為己初始化時的分支流程圖。
      具體實施方式
      下面結(jié)合附圖對本發(fā)明作進一步詳細的說明。按照本發(fā)明提供的方法,在CAR構(gòu)件編程中,singleton模式的實現(xiàn) 并非像上述Java或者.Net通過繼承一個singleton基類來獲得相應(yīng)屬 性,而是直接聲明為全局變量并進行初始化,同時對其進行多線程同步 管理,保證此全局變量只有一個實例。當用戶在.car文件中指定-個類為singleton屬性并編譯此.car 文件后,CAR編譯器會自動生成相關(guān)的處理代碼,其處理過程如下首 先會聲明幾個相關(guān)的全局變量,除了有對應(yīng)此對象的全局指針之外,還 有--個狀態(tài)值代表此對象當前的狀態(tài),以及一個全局鎖進行同步。狀態(tài)值分為三種—SingletonObjStateJJninitialize,代表此對象尚未初始 化;一SingletonObjState—Initializing,代表此對象正在進行初始化; —SingletonObjState_Initialized,代表此對象之前已初始化。用戶在判斷以上三種狀態(tài)值并進行相應(yīng)的處理之前,首先會執(zhí)行加 鎖的動作,因為狀態(tài)值為全局變量,對其進行設(shè)置時必須要加鎖以保證 多線程下不會出現(xiàn)讀寫沖突。然后用戶會根據(jù)當前不同的狀態(tài)值進入相 應(yīng)的程序分支,如圖1所示。當對象狀態(tài)為—SingletonObjState—Uninitialize時,表明對象還 沒有被別的線程初始化過,此時將進行初始化的工作,其過程為首先將 對象的全局狀態(tài)值設(shè)為—SingletonObjState—Initializing,表明當前對象正在進行初始化,由于進入分支之前已經(jīng)加鎖,所以當此狀態(tài)值設(shè)置 完畢后可以進行解鎖,讓其他線程也可以讀寫此狀態(tài)值。接著在堆中分 配一個新的car構(gòu)件對象,并將此對象的引用計數(shù)加l (這個過程中如 果分配失敗,就會重新將對象狀態(tài)設(shè)為 —SingletonObjState—Uninitialize并返回,讓其他線程進行初始化), 然后調(diào)用該對象的JnitializeComponent 0函數(shù)進行一些設(shè)置(這個過 程如果失敗,同樣也會將對象狀態(tài)設(shè)為 —SingletonObjState—Uninitialize并返回),最后在返回前才將對象的 狀態(tài)值設(shè)為—SingletonObjState—Initialized,表明此構(gòu)件對象已經(jīng)被 當前線程初始化完畢。上述過程如圖2所示。當對象狀態(tài)為—SingletonObjState—Initializing時,貝!l表明其他 線程正在對此構(gòu)件對象進行初始化,由于進入分支前己經(jīng)加鎖,此時可 以解鎖并切換至其他線程繼續(xù)進行處理,然后重新加鎖判斷全局狀態(tài)值,如果狀態(tài)值為—SingletonObjState—Uninitialize,則表示其他線程可能初始化失敗,此時解鎖并返回過程開始處由本線程重新進行初始化;如 果狀態(tài)值仍然是—SingletonObjStateJnitializing,則表明其他線程還沒有把對象初始化完畢,此時應(yīng)該返回到本分支開始處重新開始解鎖以 及喚醒其他線程再加鎖判斷狀態(tài)值這些步驟,直到檢測到對象狀態(tài)值為 —SingletonObjState—Initialized為止,此時退出此分支進入 —SingletonObjState—Initialized分支。上述過程如圖3所示。當對象狀態(tài)為—SingletonObjState—Initialized時,表明此時對象 的實例已經(jīng)被其他線程初始化過了,此時直接將對象的引用計數(shù)加1, 并返回全局對象的相應(yīng)值,最后解鎖并返回。上述流程如屈4所示。下面通過一個實施例來說明本發(fā)明的技術(shù)效果。仍以前述銀行帳戶 管理系統(tǒng)作為例子,對于AccountManager類,可以在.car文件中這樣 指定moduleinterface IAccountManager { enter();[singleton] 〃指定該類為singleton類 class CAccountManager {interface IAccountManager; CAR語言中的module描述表示--個構(gòu)件模塊,讓帶有singleton 屬性的CAccountManager類實現(xiàn)了 IAccountManager接口 ,為了簡單起 見,IAccountManager接口中只包含了--個enter()方法。使用CAR的編譯器以及CAR構(gòu)件的自動代碼生成工具對該car文件 進行處理就會生成構(gòu)件的實現(xiàn),CAR工具會生成CAccountManager接口 函數(shù)的空的實現(xiàn),而用戶只需關(guān)心自己定義的接口函數(shù)的實現(xiàn),只要填 入自己的代碼就可以了。下面是生成的cpp文件和h文件<formula>formula see original document page 11</formula>
      其中,CAccountManager. cpp是CAR工具生成的有關(guān)構(gòu)件對象底層 實現(xiàn)的代碼??梢钥吹剑趀nter方法中,設(shè)立了一個成員變量m—cCount 做為計數(shù),當調(diào)用該方法時就將它的值打印出來,可以通過它可以判斷 該類是否在全局中只有一個實例。 CAccountManager- h-裕fiidef—CACCOUNTMANAGER一H— #define —CACCOUNTMANAGER一H—#include "—CAccountManager.h"class CAcco皿tManager: public 一CAcco皿tM旭agerpublic:CARAPI enteiQ;CAccountManager() : m一cCount(O) {} CAccountManager() {puts("CAccountM肌ager dtor.");}private:int m一cCount;};可以看到成員變量m一cCoimt在構(gòu)造函數(shù)初始化時會設(shè)置成0。以下是客戶端調(diào)用此構(gòu)件方法的--個過程 #include <stdio.h>#define 一SMARTCLASSSusingAccountM旭ag汰dll; 〃弓l用AccountManager.dll構(gòu)件 intmainOECODE ec;CAccountNfanagerRef sl, s2;
      〃初始化兩個AccountManager類的實例 ec = sl.0bjlnstaiitiate(); if (FAILED(ec)) goto ErrorExit; ec = s2.0bjlnstantiate(); if (FAILED(ec》goto ErrorExit;〃分別調(diào)用兩個AccountManager類的enter方法 for (int n = 0; n < 3; n++) { sl.enter(); s2.enter();return 0;ErrorExit:printf("Error, ec = %x\n", ec); return 1;以下是運行的結(jié)果 CAccountManager enter' 1 times. C AccountManager enter 2 times. CAccountM咖ger enter 3 times. CAccountManager enter 4 times. CAccountManager enter 5 times. CAccountManager enter 6 times. CAccountManager dtor.可以看到,雖然調(diào)用的是不同的對象的enter方法,但是最終調(diào)用 的都是同一方法,而且最后調(diào)用該類析構(gòu)函數(shù)時只調(diào)用了一次。比較一下當沒有為AcciountManager對象指定singleton屬性時的運
      行結(jié)果CAccountManager enter 1 times. CAccountManager enter 1 times. CAccountManager enter 1 times. CAccountManager enter 2 times. CAccountManager enter 1 times. CAccountManager enter 2 times. CAccountManager enter 2 times. CAccountManager enter 3 times. CAccountManager enter 2 times. CAccountManager enter 3 times. CAccountManager enter 3 times. CAccountManager dtor. CAccountManager enter 3 times. CAccountManager dtor.可以看到,沒有指定singleton屬性時是分別調(diào)用了兩個不同對象 實例的enter方法,并且最后析構(gòu)時調(diào)用了兩次。這個結(jié)果是符合預(yù)期 的。同時也可看到,在具體的CAccountManager類的實現(xiàn)中,并沒有包 含任何singleton模式的管理代碼,用戶只需要指定CAccountManager 類為singleton屬性并重新編譯后,相同的實現(xiàn)代碼立即有了不同的運 行結(jié)果。用戶通過這種方式,可以很方便的用singleton模式去解決其 他工程問題。
      權(quán)利要求
      1. 一種在構(gòu)件編程中自動生成Singleton模式的方法,其特征是,包括以下步驟步驟一,定義一個全局對象變量,并定義一個全局狀態(tài)值,同時定義一個全局鎖;步驟二,對全局狀態(tài)值加鎖;步驟三,對全局狀態(tài)值進行檢測判斷,當全局狀態(tài)值為未初始化時,對對象進行初始化工作,并相應(yīng)地設(shè)置全局狀態(tài)值為正在初始化;當全局狀態(tài)值為正在初始化時,表明已經(jīng)有其他的線程進行對象的初始化工作,此時該線程將會進入等待狀態(tài),并且通過全局狀態(tài)值不斷檢測正在分配對象的線程的狀況;當全局狀態(tài)值為已初始化時,獲得全局對象變量的值;步驟四,全局狀態(tài)值解鎖并返回對象的值。
      2、 根據(jù)權(quán)利要求1所述的在構(gòu)件編程中自動生成Singleton模式的方 法,其特征是,當全局狀態(tài)值為未初始化時,按照如下步驟完成所述的對 對象的狀態(tài)值進行設(shè)置步驟l,將全局狀態(tài)值設(shè)置為正在初始化; 步驟2,對狀態(tài)值解鎖;步驟3,在堆中分配新的構(gòu)件對象,并將其引用計數(shù)加l;步驟4,判斷分配是否成功,當分配不成功時,將全局狀態(tài)值設(shè)為未 初始化并返回;當分配成功時,調(diào)用對象的初始化元件方法進行設(shè)置并執(zhí) 行下述步驟5;步驟5,判斷設(shè)置是否成功,當設(shè)置成功時,將對象的狀態(tài)值設(shè)為己 初始化并返回;當設(shè)置不成功時,將所述全局狀態(tài)值設(shè)為未初始化并返回。
      3、根據(jù)權(quán)利要求1所述的在構(gòu)件編程中自動生成Singleton模式的方 法,其特征是,當所述全局狀態(tài)值為正在初始化時,按如下步驟完成所述 的檢測其他線程分配對象的狀況步驟A,對全局狀態(tài)值解鎖;步驟B,切換到其他線程;步驟C,對全局狀態(tài)值加鎖;步驟D,判斷其他線程是否分配對象失敗,當其他線程分配對象失敗 時,全局狀態(tài)值解鎖并返回所述步驟二重新執(zhí)行對象初始化工作;當其他 線程分配對象成功時,執(zhí)行下述步驟E;步驟E,判斷其他線程是否已經(jīng)完成對象的分配,當其他線程未完成 對象的分配時,跳回步驟A;當其他線程己完成對象的分配時,按所述步驟三獲得全局對象變量的值。
      全文摘要
      本發(fā)明公開了一種在構(gòu)件編程中自動生成Singleton模式的方法,包括以下步驟定義一個全局對象變量、一個全局狀態(tài)值及一個全局鎖;對狀態(tài)值加鎖;對全局狀態(tài)值進行檢測判斷,當全局狀態(tài)值為未初始化時,對對象初始化,并相應(yīng)地設(shè)置全局狀態(tài)值為正在初始化;當全局狀態(tài)值為正在初始化時,表明已有其他線程進行對象的初始化,此時該線程將會進入等待狀態(tài),并且通過全局狀態(tài)值不斷檢測正在分配對象的線程的狀況;當全局狀態(tài)值為已初始化時,獲得全局對象變量的值;全局狀態(tài)值解鎖并返回對象的值。本發(fā)明直接聲明全局變量并進行初始化,同時對其進行多線程同步管理,當編譯相應(yīng)car文件后自動生成相關(guān)Singleton模式實現(xiàn)代碼,降低用戶編程復(fù)雜程度。
      文檔編號G06F9/46GK101211273SQ200610147859
      公開日2008年7月2日 申請日期2006年12月25日 優(yōu)先權(quán)日2006年12月25日
      發(fā)明者洋 楊, 梁宇洲, 榕 陳 申請人:上??铺┦兰o科技有限公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1