專利名稱:在構(gòu)件編程中自動(dòng)生成Singleton模式的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種程序代碼的生成方法,特別涉及一種在構(gòu)件編程中自 動(dòng)生成Singleton模式的方法。
背景技術(shù):
二十世紀(jì)八十年代以來,軟件編程技術(shù)有了很大的發(fā)展,其發(fā)展可以 大致分為以下幾個(gè)階段面向?qū)ο缶幊?,即通過對軟件模塊的封裝,使其相對獨(dú)立,從而使復(fù) 雜的問題簡單化。面向?qū)ο缶幊虖?qiáng)調(diào)的是對象的封裝,但模塊(對象)之 間的關(guān)系在編譯的時(shí)候已被固定,模塊之間的關(guān)系是靜態(tài)的,這種關(guān)系在程序運(yùn)行時(shí)不能改變;也就是說在運(yùn)行時(shí)不能換用模塊中更小的功能單元。面向構(gòu)件編程,即為了使不同軟件開發(fā)商提供的構(gòu)件模塊(軟件對象) 可以相互操作使用,構(gòu)件之間的連接和調(diào)用通過標(biāo)準(zhǔn)的協(xié)議來實(shí)現(xiàn)。構(gòu)件 化編程模型強(qiáng)調(diào)協(xié)議標(biāo)準(zhǔn),需要提供各廠商都能遵守的協(xié)議體系。就像公 制螺絲的杏5準(zhǔn)一樣,所有符合標(biāo)準(zhǔn)的嫘絲和嫘母都可以相互裝配。構(gòu)件化 編程模型建立在面向?qū)ο蠹夹g(shù)的基礎(chǔ)之上,是完全面向?qū)ο蟮?,提供了?dòng) 態(tài)構(gòu)造部件模塊(在運(yùn)行中可以構(gòu)造部件)的機(jī)制。構(gòu)件在運(yùn)行時(shí)可以動(dòng) 態(tài)裝入,是可以更換的。但是,現(xiàn)有的面向構(gòu)件編程技術(shù)要求用戶自行定 義構(gòu)件的非自描述接口,使得用戶程序的開發(fā)依然繁復(fù)。
CAR (Component Assembly Runtime)構(gòu)件技術(shù)是一種面向構(gòu)件編程技術(shù),它定義了一套網(wǎng)絡(luò)編程時(shí)代的構(gòu)件編程模型和編程規(guī)范,它規(guī)定了 一組構(gòu)件間相互調(diào)用的標(biāo)準(zhǔn),使得二進(jìn)制構(gòu)件能夠自描述,能夠在運(yùn)行時(shí) 動(dòng)態(tài)鏈接。CAR與微軟的COM相比,刪除了COM中過時(shí)的約定,禁止用戶 定義COM的非自描述接口;完備了構(gòu)件及其接口的自描述功能,并且對用 戶界面進(jìn)行了簡化包裝,易學(xué)易用。在一種嵌入式操作系統(tǒng)上,CAR構(gòu)件 技術(shù)由CAR語言(構(gòu)件描述語言,描述構(gòu)件的元數(shù)據(jù)信息)、CAR編譯器、 自動(dòng)代碼生成工具以及CAR構(gòu)件基礎(chǔ)庫支持。CAR構(gòu)件技術(shù)體現(xiàn)了網(wǎng)絡(luò)編 程時(shí)代的特性,編程界面簡單。在嵌入式操作系統(tǒng)軟件開發(fā)工具包(SDK)的支持下,CAR技術(shù)使得 原來高深難懂的構(gòu)件編程技術(shù)很容易被0/0++程序員理解并掌握。用戶只 需要用腳本語言設(shè)計(jì)相關(guān)類和接口的關(guān)系以及其屬性,并存為.car文件, 通過CAR ^器的處理就可以自動(dòng)生成相關(guān)的代碼。單例模式(Singleton模式)屬于設(shè)計(jì)模式中的--種方法,它的目的 是保證一個(gè)類僅有--個(gè)實(shí)例,并提供一個(gè)能夠訪問它的全局訪問點(diǎn)。這種 模式在實(shí)際開發(fā)中的應(yīng)用也非常多,例如在嵌入式圖形系統(tǒng)應(yīng)用中,由于 內(nèi)存資源比較寶貴,很多模塊都必須保證在整個(gè)過程中只能有一個(gè)實(shí)例。 在實(shí)際編程設(shè)計(jì)中,如果要運(yùn)用該模式,用戶可以設(shè)計(jì)一個(gè)Singleton 的基類,然后在其子類實(shí)例中進(jìn)行各種擴(kuò)展來配置應(yīng)用,也可以直接設(shè)計(jì) 一個(gè)不允許繼承的Singleton類,里面包含了相關(guān)功能。無論采取哪種方 法,用戶都必須自行實(shí)現(xiàn)Singleton模式的相關(guān)代碼。如果能找到一種在 CAR構(gòu)件編程中自動(dòng)生成singleton模式代碼的方法,將大大降低用戶編
程的復(fù)雜程度。考慮一個(gè)銀行帳戶管理系統(tǒng),其中有上百萬個(gè)客戶帳號,要訪問每-個(gè)客戶的帳號,需要對客戶的權(quán)限進(jìn)行驗(yàn)證。在這樣的系統(tǒng)里,可以設(shè)計(jì)一個(gè)Singleton類叫做AccountManager,用來管理系統(tǒng)中的客戶帳戶,此類的實(shí)例在整個(gè)系統(tǒng)中只有一個(gè),如果用Ctt實(shí)現(xiàn)的話,在多線程環(huán)境下,可以采用以下方法public s.ealed class AccountManager這個(gè)類的其他功能實(shí)現(xiàn)代碼……以下是singleton模式的實(shí)現(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中的基本實(shí)現(xiàn),AccountManager類被設(shè) 計(jì)成不可繼承,當(dāng)其靜態(tài)成員變量instance—為空時(shí)才在堆中進(jìn)行類的初 始化,其他情況下直接返回該類的實(shí)例instance—的值,這樣就保證了系 統(tǒng)內(nèi)始終只有一個(gè)該類的實(shí)例,整個(gè)過程通過加鎖保證多線程下的-致 性。可以看到,不同的用戶和不同的語言對于Singleton模式的實(shí)現(xiàn)可能 不相同,但是都必須自己進(jìn)行Singleton類的編寫,這樣用戶在實(shí)現(xiàn)類的 功能的同時(shí),還必須花精力去實(shí)現(xiàn)singleton模式的相關(guān)代碼,這給用戶 的編程帶來一定的復(fù)雜度。發(fā)明內(nèi)容本發(fā)明的主要目的在于提供一種在構(gòu)件編程中自動(dòng)生成Singleton模 式的方法,當(dāng)編譯相應(yīng)car文件后就可自動(dòng)生成實(shí)現(xiàn)此類Singleton的相關(guān) 代碼,而用戶只需要關(guān)注此構(gòu)件基本功能的實(shí)現(xiàn),大大降低了用戶編程的 負(fù)擔(dān)。為解決上述技術(shù)問題,本發(fā)明在構(gòu)件編程中自動(dòng)生成Singleton模式的 方法,基于CAR構(gòu)件編程,包括以下步驟步驟一,定義一個(gè)全局對象變量, 并定義一個(gè)全局狀態(tài)值,同時(shí)定義一個(gè)全局鎖;步驟二,對狀態(tài)值加鎖; 步驟三,對全局狀態(tài)值進(jìn)行檢測判斷,對對象進(jìn)行初始化工作,并相應(yīng)地 設(shè)置全局狀態(tài)值為正在初始化;當(dāng)全局狀態(tài)值為正在初始化時(shí),表明已經(jīng) 有其他的線程進(jìn)行對象的初始化工作,此時(shí)該線程將會(huì)進(jìn)入等待狀態(tài),并
且通過全局狀態(tài)值不斷檢測正在分配對象的線程的狀況;當(dāng)全局狀態(tài)值為 己初始化時(shí),獲得全局對象變量的值;步驟四,返回對象的值。本發(fā)明所提供的方法中,singleton的實(shí)現(xiàn)并非像Java或者.Net通 過繼承一個(gè)singleton基類來獲得相應(yīng)屬性,而是直接聲明為全局變量并 進(jìn)行初始化,同時(shí)對其進(jìn)行多線程同步管理,保證此全局變量只有一個(gè)實(shí) 例,當(dāng)編譯相應(yīng)car文件后就可自動(dòng)生成實(shí)現(xiàn)此類Singleton,大大降低 了用戶編程復(fù)雜程度。
圖1是本發(fā)明的流程圖;圖2是屈1中全局狀態(tài)值為未初始化時(shí)的分支流程圖; 圖3是圖1中全局狀態(tài)值為正在初始化時(shí)的分支流程圖; 圖4圖1中全局狀態(tài)值為己初始化時(shí)的分支流程圖。
具體實(shí)施方式
下面結(jié)合附圖對本發(fā)明作進(jìn)一步詳細(xì)的說明。按照本發(fā)明提供的方法,在CAR構(gòu)件編程中,singleton模式的實(shí)現(xiàn) 并非像上述Java或者.Net通過繼承一個(gè)singleton基類來獲得相應(yīng)屬 性,而是直接聲明為全局變量并進(jìn)行初始化,同時(shí)對其進(jìn)行多線程同步 管理,保證此全局變量只有一個(gè)實(shí)例。當(dāng)用戶在.car文件中指定-個(gè)類為singleton屬性并編譯此.car 文件后,CAR編譯器會(huì)自動(dòng)生成相關(guān)的處理代碼,其處理過程如下首 先會(huì)聲明幾個(gè)相關(guān)的全局變量,除了有對應(yīng)此對象的全局指針之外,還 有--個(gè)狀態(tài)值代表此對象當(dāng)前的狀態(tài),以及一個(gè)全局鎖進(jìn)行同步。狀態(tài)值分為三種—SingletonObjStateJJninitialize,代表此對象尚未初始 化;一SingletonObjState—Initializing,代表此對象正在進(jìn)行初始化; —SingletonObjState_Initialized,代表此對象之前已初始化。用戶在判斷以上三種狀態(tài)值并進(jìn)行相應(yīng)的處理之前,首先會(huì)執(zhí)行加 鎖的動(dòng)作,因?yàn)闋顟B(tài)值為全局變量,對其進(jìn)行設(shè)置時(shí)必須要加鎖以保證 多線程下不會(huì)出現(xiàn)讀寫沖突。然后用戶會(huì)根據(jù)當(dāng)前不同的狀態(tài)值進(jìn)入相 應(yīng)的程序分支,如圖1所示。當(dāng)對象狀態(tài)為—SingletonObjState—Uninitialize時(shí),表明對象還 沒有被別的線程初始化過,此時(shí)將進(jìn)行初始化的工作,其過程為首先將 對象的全局狀態(tài)值設(shè)為—SingletonObjState—Initializing,表明當(dāng)前對象正在進(jìn)行初始化,由于進(jìn)入分支之前已經(jīng)加鎖,所以當(dāng)此狀態(tài)值設(shè)置 完畢后可以進(jìn)行解鎖,讓其他線程也可以讀寫此狀態(tài)值。接著在堆中分 配一個(gè)新的car構(gòu)件對象,并將此對象的引用計(jì)數(shù)加l (這個(gè)過程中如 果分配失敗,就會(huì)重新將對象狀態(tài)設(shè)為 —SingletonObjState—Uninitialize并返回,讓其他線程進(jìn)行初始化), 然后調(diào)用該對象的JnitializeComponent 0函數(shù)進(jìn)行一些設(shè)置(這個(gè)過 程如果失敗,同樣也會(huì)將對象狀態(tài)設(shè)為 —SingletonObjState—Uninitialize并返回),最后在返回前才將對象的 狀態(tài)值設(shè)為—SingletonObjState—Initialized,表明此構(gòu)件對象已經(jīng)被 當(dāng)前線程初始化完畢。上述過程如圖2所示。當(dāng)對象狀態(tài)為—SingletonObjState—Initializing時(shí),貝!l表明其他 線程正在對此構(gòu)件對象進(jìn)行初始化,由于進(jìn)入分支前己經(jīng)加鎖,此時(shí)可 以解鎖并切換至其他線程繼續(xù)進(jìn)行處理,然后重新加鎖判斷全局狀態(tài)值,如果狀態(tài)值為—SingletonObjState—Uninitialize,則表示其他線程可能初始化失敗,此時(shí)解鎖并返回過程開始處由本線程重新進(jìn)行初始化;如 果狀態(tài)值仍然是—SingletonObjStateJnitializing,則表明其他線程還沒有把對象初始化完畢,此時(shí)應(yīng)該返回到本分支開始處重新開始解鎖以 及喚醒其他線程再加鎖判斷狀態(tài)值這些步驟,直到檢測到對象狀態(tài)值為 —SingletonObjState—Initialized為止,此時(shí)退出此分支進(jìn)入 —SingletonObjState—Initialized分支。上述過程如圖3所示。當(dāng)對象狀態(tài)為—SingletonObjState—Initialized時(shí),表明此時(shí)對象 的實(shí)例已經(jīng)被其他線程初始化過了,此時(shí)直接將對象的引用計(jì)數(shù)加1, 并返回全局對象的相應(yīng)值,最后解鎖并返回。上述流程如屈4所示。下面通過一個(gè)實(shí)施例來說明本發(fā)明的技術(shù)效果。仍以前述銀行帳戶 管理系統(tǒng)作為例子,對于AccountManager類,可以在.car文件中這樣 指定moduleinterface IAccountManager { enter();[singleton] 〃指定該類為singleton類 class CAccountManager {interface IAccountManager; CAR語言中的module描述表示--個(gè)構(gòu)件模塊,讓帶有singleton 屬性的CAccountManager類實(shí)現(xiàn)了 IAccountManager接口 ,為了簡單起 見,IAccountManager接口中只包含了--個(gè)enter()方法。使用CAR的編譯器以及CAR構(gòu)件的自動(dòng)代碼生成工具對該car文件 進(jìn)行處理就會(huì)生成構(gòu)件的實(shí)現(xiàn),CAR工具會(huì)生成CAccountManager接口 函數(shù)的空的實(shí)現(xiàn),而用戶只需關(guān)心自己定義的接口函數(shù)的實(shí)現(xiàn),只要填 入自己的代碼就可以了。下面是生成的cpp文件和h文件<formula>formula see original document page 11</formula>
其中,CAccountManager. cpp是CAR工具生成的有關(guān)構(gòu)件對象底層 實(shí)現(xiàn)的代碼??梢钥吹?,在enter方法中,設(shè)立了一個(gè)成員變量m—cCount 做為計(jì)數(shù),當(dāng)調(diào)用該方法時(shí)就將它的值打印出來,可以通過它可以判斷 該類是否在全局中只有一個(gè)實(shí)例。 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í)會(huì)設(shè)置成0。以下是客戶端調(diào)用此構(gòu)件方法的--個(gè)過程 #include <stdio.h>#define 一SMARTCLASSSusingAccountM旭ag汰dll; 〃弓l用AccountManager.dll構(gòu)件 intmainOECODE ec;CAccountNfanagerRef sl, s2;
〃初始化兩個(gè)AccountManager類的實(shí)例 ec = sl.0bjlnstaiitiate(); if (FAILED(ec)) goto ErrorExit; ec = s2.0bjlnstantiate(); if (FAILED(ec》goto ErrorExit;〃分別調(diào)用兩個(gè)AccountManager類的enter方法 for (int n = 0; n < 3; n++) { sl.enter(); s2.enter();return 0;ErrorExit:printf("Error, ec = %x\n", ec); return 1;以下是運(yùn)行的結(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ù)時(shí)只調(diào)用了一次。比較一下當(dāng)沒有為AcciountManager對象指定singleton屬性時(shí)的運(yùn)
行結(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屬性時(shí)是分別調(diào)用了兩個(gè)不同對象 實(shí)例的enter方法,并且最后析構(gòu)時(shí)調(diào)用了兩次。這個(gè)結(jié)果是符合預(yù)期 的。同時(shí)也可看到,在具體的CAccountManager類的實(shí)現(xiàn)中,并沒有包 含任何singleton模式的管理代碼,用戶只需要指定CAccountManager 類為singleton屬性并重新編譯后,相同的實(shí)現(xiàn)代碼立即有了不同的運(yùn) 行結(jié)果。用戶通過這種方式,可以很方便的用singleton模式去解決其 他工程問題。
權(quán)利要求
1. 一種在構(gòu)件編程中自動(dòng)生成Singleton模式的方法,其特征是,包括以下步驟步驟一,定義一個(gè)全局對象變量,并定義一個(gè)全局狀態(tài)值,同時(shí)定義一個(gè)全局鎖;步驟二,對全局狀態(tài)值加鎖;步驟三,對全局狀態(tài)值進(jìn)行檢測判斷,當(dāng)全局狀態(tài)值為未初始化時(shí),對對象進(jìn)行初始化工作,并相應(yīng)地設(shè)置全局狀態(tài)值為正在初始化;當(dāng)全局狀態(tài)值為正在初始化時(shí),表明已經(jīng)有其他的線程進(jìn)行對象的初始化工作,此時(shí)該線程將會(huì)進(jìn)入等待狀態(tài),并且通過全局狀態(tài)值不斷檢測正在分配對象的線程的狀況;當(dāng)全局狀態(tài)值為已初始化時(shí),獲得全局對象變量的值;步驟四,全局狀態(tài)值解鎖并返回對象的值。
2、 根據(jù)權(quán)利要求1所述的在構(gòu)件編程中自動(dòng)生成Singleton模式的方 法,其特征是,當(dāng)全局狀態(tài)值為未初始化時(shí),按照如下步驟完成所述的對 對象的狀態(tài)值進(jìn)行設(shè)置步驟l,將全局狀態(tài)值設(shè)置為正在初始化; 步驟2,對狀態(tài)值解鎖;步驟3,在堆中分配新的構(gòu)件對象,并將其引用計(jì)數(shù)加l;步驟4,判斷分配是否成功,當(dāng)分配不成功時(shí),將全局狀態(tài)值設(shè)為未 初始化并返回;當(dāng)分配成功時(shí),調(diào)用對象的初始化元件方法進(jìn)行設(shè)置并執(zhí) 行下述步驟5;步驟5,判斷設(shè)置是否成功,當(dāng)設(shè)置成功時(shí),將對象的狀態(tài)值設(shè)為己 初始化并返回;當(dāng)設(shè)置不成功時(shí),將所述全局狀態(tài)值設(shè)為未初始化并返回。
3、根據(jù)權(quán)利要求1所述的在構(gòu)件編程中自動(dòng)生成Singleton模式的方 法,其特征是,當(dāng)所述全局狀態(tài)值為正在初始化時(shí),按如下步驟完成所述 的檢測其他線程分配對象的狀況步驟A,對全局狀態(tài)值解鎖;步驟B,切換到其他線程;步驟C,對全局狀態(tài)值加鎖;步驟D,判斷其他線程是否分配對象失敗,當(dāng)其他線程分配對象失敗 時(shí),全局狀態(tài)值解鎖并返回所述步驟二重新執(zhí)行對象初始化工作;當(dāng)其他 線程分配對象成功時(shí),執(zhí)行下述步驟E;步驟E,判斷其他線程是否已經(jīng)完成對象的分配,當(dāng)其他線程未完成 對象的分配時(shí),跳回步驟A;當(dāng)其他線程己完成對象的分配時(shí),按所述步驟三獲得全局對象變量的值。
全文摘要
本發(fā)明公開了一種在構(gòu)件編程中自動(dòng)生成Singleton模式的方法,包括以下步驟定義一個(gè)全局對象變量、一個(gè)全局狀態(tài)值及一個(gè)全局鎖;對狀態(tài)值加鎖;對全局狀態(tài)值進(jìn)行檢測判斷,當(dāng)全局狀態(tài)值為未初始化時(shí),對對象初始化,并相應(yīng)地設(shè)置全局狀態(tài)值為正在初始化;當(dāng)全局狀態(tài)值為正在初始化時(shí),表明已有其他線程進(jìn)行對象的初始化,此時(shí)該線程將會(huì)進(jìn)入等待狀態(tài),并且通過全局狀態(tài)值不斷檢測正在分配對象的線程的狀況;當(dāng)全局狀態(tài)值為已初始化時(shí),獲得全局對象變量的值;全局狀態(tài)值解鎖并返回對象的值。本發(fā)明直接聲明全局變量并進(jìn)行初始化,同時(shí)對其進(jìn)行多線程同步管理,當(dāng)編譯相應(yīng)car文件后自動(dòng)生成相關(guān)Singleton模式實(shí)現(xiàn)代碼,降低用戶編程復(fù)雜程度。
文檔編號G06F9/46GK101211273SQ200610147859
公開日2008年7月2日 申請日期2006年12月25日 優(yōu)先權(quán)日2006年12月25日
發(fā)明者洋 楊, 梁宇洲, 榕 陳 申請人:上??铺┦兰o(jì)科技有限公司