1. 程式人生 > >linux下c++ 實現單例模式

linux下c++ 實現單例模式

singleton.h,下面是原始碼
#include    <unistd.h>
#include    <pthread.h>
using namespace std;
class Lock  {
    private:
        pthread_mutex_t m_lock;
    public:
        Lock(pthread_mutex_t  cs) : m_lock(cs) {
            pthread_mutex_lock(&m_lock);
        }
        ~Lock() {
            pthread_mutex_unlock(&m_lock);
        }
};//鎖類,實現多執行緒環境下高效工作

class Singleton {
    private:
        Singleton() {};
        Singleton(const Singleton &);
        Singleton& operator = (const Singleton &);

    public:
        static Singleton *Instantialize();
        static Singleton *pInstance;
        static pthread_mutex_t  mutex;
};
#endif
singleton.cc檔案
<pre name="code" class="html">#include "singleton.h"
pthread_mutex_t  Singleton::mutex = PTHREAD_MUTEX_INITIALIZER;
Singleton* Singleton::pInstance = 0;

Singleton* Singleton::Instantialize()   {   
    if(pInstance == NULL)   {   
        //double check
        Lock lock(mutex);           //用lock實現執行緒安全,用資源管理類,實現異常安全
        //使用資源管理類,在丟擲異常的時候,資源管理類物件會被析構,析構總是發生的無論是因為異常丟擲還是語句塊結束。
        if(pInstance == NULL)   {   
            pInstance = new Singleton();
        }   
    }   
    return pInstance;
}
~                   

tmain.cc
<pre name="code" class="html">#include    <iostream>
#include    <cassert>
#include    <unistd.h>
#include    <pthread.h>

#include    "singleton.h"

int main(int argc, char *argv[]) {
    Singleton *p = Singleton::Instantialize(); 
    Singleton *q = Singleton::Instantialize(); 
    assert(p != q); 
    return 0;
}

makefile
<pre name="code" class="html">#lizhiming
CC=gcc
CXX=g++
AR=ar
ARFLAGS=cru
CURRENT_DIR=$(shell echo `pwd`)
PARENT_DIRNAME=$(shell basename $(shell dirname $(CURRENT_DIR)))
SOURCE_DIR=$(CURRENT_DIR)/src
PREFIX=${CURRENT_DIR}
DEBUG :=
CFLAGS := $(DEBUG) -g -c -fPIC -Wshadow -Wcast-qual -Wcast-align  \
          -Wwrite-strings -Wsign-compare -Winvalid-pch -fms-extensions \
          -Wall \
          -I./include

CPPFLAGS=$(CFLAGS) -Woverloaded-virtual -Wsign-promo -fno-gnu-keywords

LDFLAGS=-L/usr/local/lib  \
        -lpthread\


DIRNAME=$(shell basename `pwd`)

SRCXXS := $(wildcard *.cc) \
          $(wildcard ./src/*.cc)

SRCS := $(SRCXXS)

CXXOBJS := $(patsubst %.cc, %.o, $(SRCXXS))
OBJS := ${CXXOBJS} \

DEPS := $(patsubst %.o, %.d, $(OBJS))

TARGET := lib$(PARENT_DIRNAME)_$(DIRNAME).so

ARFLAGS := -cvq

TARGET_A_LIB := lib$(PARENT_DIRNAME)_$(DIRNAME).a

all : $(TARGET) $(TARGET_A_LIB)
    
$(TARGET_A_LIB): $(OBJS)
    @ar $(ARFLAGS) [email protected] $^
    @ranlib [email protected] 

$(TARGET) : $(OBJS)
    $(CXX) $(OBJS) $(LDFLAGS) -o [email protected] -shared

-include $(DEPS)

%.o : %.cc
    $(CXX) $(CPPFLAGS) $< -o [email protected]



t:
    @echo "DIRNAME:" $(DIRNAME)
 @echo "PARENT_DIRNAME:" $(PARENT_DIRNAME)
    @echo "SRCS:" $(SRCS)
    @echo "OBJS:" $(OBJS)
    @echo "CFLAGS:" $(CFLAGS)
    @echo "CPPFLAGS:" $(CPPFLAGS)
    @echo "ARFLAGS:" $(ARFLAGS)


clean:
    rm -rf *.o *.d *.a $(OBJS) $(DEPS) $(TARGET) 
                                                


相關推薦

linuxc++ 實現模式

singleton.h,下面是原始碼#include <unistd.h> #include <pthread.h> using namespace std; class Lock { private: pthr

C++實現模式

提幾個問題吧 1.執行緒安全 2.單件物件與物件彼此依賴,析構可能出現問題 3.必須從此類派生 有時候想想,單件這東西真是有點多餘,文件齊全命名規範的全域性變數或全域性函式完全不會有問題。

C++實現模式(包括採用C++11中的智慧指標)

    對於設計模式來說,以前只是看過基礎的理論,很多都沒有實現和使用過。這段時間看到了別人C++程式碼中使用了單例模式,發現了很多新的東西,特此總結記錄一下。說話比較囉嗦,希望由淺入深,幫助大家理解!     單例模式,顧名思義,即一個類只有一個例項物件。C++一般的方法

C++ 實現模式

單例模式是任何面嚮物件語言繞不過的,單例模式是很有必要的,接下來我用最樸素的語言來解釋和記錄單例模式的學習。什麼是單例模式?單例模式就是一個類只能被例項化一次 ,更準確的說是只能有一個例項化的物件的類。建立一個單例模式的類(初想)一個類只能有一個例項化的物件,那麼這個類就要禁

C++實現模式4——C++11實現

std::atomic<Singleton*> Singleton::m_instance; std::mutex Singleton::m_mutex; Singleton* Singleton::getInstance() { Singleton* tmp = m_instance

利用c++的private和static實現模式

精髓就是 將建構函式設定為private屬性,並且將複製建構函式和賦值建構函式也設定為private屬性,這樣的話,就無法在外部建立物件,所以此時還需要一個public的函式:getHumanInterface(),這個函式來呼叫private屬性的建構函式來生成我們需要的物件,並且將這個物

C++】模式C++實現

單例模式的概念 只允許一個產生一個物件的類單例模式的實現方法 1.單例類保證全域性只有唯一一個自行建立的例項物件 2.單例類提供獲取這個唯一例項的介面單例模式的優缺點 優點 (1)阻止其他度物件例項化

C++ (設計模式實現模式

設計模式 從實踐的角度來看,設計模式有兩個重要的屬性。首先,它們描述了經過驗證的、成功的設計技術,這些技術可以按上下文相關的方式進行定製,一遍滿足新的設計場合的要求。其次,並且可能更重要的是,在提及某個特定模式的應用時不僅包括其中用到的技術,還包括應用該模式的動因以及應用後所達到的效果。

C#/.NET 模式——懶漢式,餓漢式,三種實現方法

C# 單例模式 ——懶漢式,餓漢式# 註釋: /// 單例模式 /// /// 餓漢式 :第一時間建立例項,類載入就馬上建立 /// 懶漢式 :需要才建立例項,延遲載入 /// /// 單例模式會長期持有一個物件,不會釋放 /// 普通例項使用完後釋放 /// /// 單例

C++ Singleton () 模式最優實現

J. Nakamura 把它叫作 "Gamma Singleton", 因為這是 Gamma 在他大名鼎鼎的 <<設計模式>> (<<Design Patterns>>) [Gamma] 一書採用的方法. 稱它為 "懶漢模式" 是因為單例例項只在第一次被使

C++如何實現模式

C++有時會用到單例模式,比如和資料庫連線的類,我們只需要一個物件,那麼這時候我們就要限制類物件產生的數量,允許一個類產生一個物件,如何讓一個類產生一個物件呢,也就是實現單例模式? 方法一:將建構函式

(C++)用模板或巨集實現模式

最近在cocos2d-x開發中經常會用到單例模式,而每個單例模式類實際上具備相似的基礎結構,為了便於快速寫出一個具有單例模式的類,可以藉助模板或者巨集。 1.單例模式的類實現 首先,給出一個基本的實現單例模式的程式碼: class Singleton { public:

C++:利用靜態成員實現模式

在網上看了兩三天的網課,瞭解了一下C++,正好做作業遇到一個問題,解決之後覺得有必要寫到部落格裡,就發出來了。 問題是:如何實現“單例模式”,也就是說某個物件只能有一個例項。 思路: 1.需要一個

溫故而知新(java實現)模式的七種寫法

反序 防止 代碼 工作 html 我想 變種 evel 才會 第一種(懶漢,線程不安全): Java代碼 public class Singleton { private static Singleton instance; private S

c++之模式

lsi 但是 desc 模式 單例模式 ron spl 希望 構造函數 1 本篇主要討論下多線程下的單例模式實現:   首先是 double check 實現方式: 這種模式可以滿足多線程環境下,只產生一個實例。 template<typename T>

C#】模式&lt;機房重構&gt;

機房 .sh 不能 是否 gist 應用 調用方法 單例模式 sender 前言 在機房重構之前。我們學習了設計模式。在這次重構中,我們的任務就是將這些模式,加入到機房的重構中去。如今先來解決一個最簡單的問題——窗口的超生。 假設不加以限

c++的模式c++11對模式的優化

on() end per let namespace lease 是否 存在 建立 單例模式 單例模式,可以說設計模式中最常應用的一種模式了,據說也是面試官最喜歡的題目。但是如果沒有學過設計模式的人,可能不會想到要去應用單例模式,面對單例模式適用的情況,可能會優先考慮使用全

Java枚舉enum以及應用:枚舉實現模式

tee configure adr 自由 這樣的 pre 單例模式 做到 build 枚舉作為一個常規的語言概念,一直到Java5才誕生不得不說有點奇怪,以至於到現在為止很多程序員仍然更喜歡用static final的形式去命名常量而不使用,一般情況下,Java程序員用這種

Python 實現模式

python 單例模式 Python 實現單例模式 # 使用Python實現單例模式 # 方法一: 使用__new__方法 class SingleTon(object): def __new__(cls, *args, **kwargs): if not ha

Linuxc實現域名轉IP的方法封裝

rrd dbv mvm com inf adk lan fad bho 蝕古戮一爸下戀墩諂棧鐘啥材諭http://jz.docin.com/kjr58937 囪弛探刻煌俺厴嘲蹤以洶趴敵柿http://www.docin.com/app/user/userinfo?useri