青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

OnTheWay2012
埋葬昨天的我,迎來重生的我!
posts - 15,  comments - 89,  trackbacks - 0
昨天寫了一篇隨筆,里面提到了單例模式,本來沒有想多說單例模式,可是有人回復說讓我先看看線程安全再來談設計模式。
今天閑來無事就隨便寫了個線程安全的設計模式,具體代碼如下:
  1#include <iostream>
  2#include <vector>
  3#include <bitset>
  4#include <assert.h>
  5#include <Windows.h>
  6#include <process.h>
  7
  8using namespace std;
  9
 10class CSingleton
 11{
 12private:
 13    class CAssistForSingleton
 14    {
 15    private:
 16        CRITICAL_SECTION m_cs;
 17
 18    public:
 19        CAssistForSingleton()
 20        {
 21            InitializeCriticalSection(&m_cs);
 22        }

 23
 24        ~CAssistForSingleton()
 25        {
 26            DeleteCriticalSection(&m_cs);
 27        }

 28
 29    public:
 30        void Lock()
 31        {
 32            EnterCriticalSection(&m_cs);
 33        }

 34
 35        void UnLock()
 36        {
 37            LeaveCriticalSection(&m_cs);
 38        }

 39    }
;
 40
 41private:
 42    static CAssistForSingleton m_refSycObj;
 43    static CSingleton *m_pInstance;
 44
 45    static int m_nData;
 46
 47private:
 48    CSingleton()
 49    {
 50
 51    }

 52
 53public:
 54    static CSingleton *GetInstatnce()
 55    {
 56        m_refSycObj.Lock();
 57        if (NULL == m_pInstance)
 58        {
 59            m_pInstance = new CSingleton;
 60            cout<<"new CSingleton"<<endl;
 61        }

 62        m_refSycObj.UnLock();
 63
 64        return m_pInstance;
 65    }

 66
 67public:
 68    static int GetData() 
 69    {
 70        return m_nData;
 71    }

 72
 73    static void SetData(int nData)
 74    {
 75        m_refSycObj.Lock();
 76        m_nData = nData;
 77        m_refSycObj.UnLock();
 78    }

 79}
;
 80
 81CSingleton::CAssistForSingleton CSingleton::m_refSycObj = CSingleton::CAssistForSingleton();
 82CSingleton *CSingleton::m_pInstance = NULL;
 83int CSingleton::m_nData = 0;
 84
 85unsigned int WINAPI ThreadFun(void *)
 86{
 87    cout<<"Launcher Thread"<<endl;
 88    
 89    for(int i = 0 ; i < 99999999 ; i++)
 90    {
 91        CSingleton *pSingl = CSingleton::GetInstatnce();
 92        if (NULL != pSingl)
 93        {
 94            pSingl->SetData(i);
 95        }

 96
 97        Sleep(500);
 98    }

 99
100    return 0;
101}

102
103int main(int argv, char *argc[])
104{
105    uintptr_t HandleThread[10];
106    unsigned int nThreadId = 0;
107    for(int i = 0 ; i < 10 ; i++)
108    {
109        HandleThread[i] = _beginthreadex(NULL, 0, ThreadFun, NULL, 0&nThreadId);
110    }

111
112    WaitForMultipleObjects(10, (const HANDLE *)HandleThread, TRUE, INFINITE);
113
114    return 0;
115}

116
117

以上就是我的實現,有什么問題歡迎批評指針。
posted on 2010-05-21 09:52 OnTheWay 閱讀(5786) 評論(15)  編輯 收藏 引用 所屬分類: 軟件設計

FeedBack:
# re: 一種線程安全的單例模式實現方式
2010-05-21 10:15 | 戰魂小筑
1. 可以不用單件, 程序開始時全局new出來, 以后不用鎖,直接用就好.
2. 既然全是靜態數據, 還需要用Singleton呢?
3. 用Interlock會更高效  回復  更多評論
  
# re: 一種線程安全的單例模式實現方式
2010-05-21 10:52 | GunsNRose
之前看過一個,建議將構造弄成 私有的,生成實例由 GetInstatnce來做
別人new是new不了的  回復  更多評論
  
# re: 一種線程安全的單例模式實現方式
2010-05-21 15:37 | OwnWaterloo
依然不是線程安全的。  回復  更多評論
  
# re: 一種線程安全的單例模式實現方式
2010-05-21 21:02 | ccsdu2009
去看看ZThread中的單件吧

以前的話我會推薦loki的
但是現在歸納絕那個太復雜了  回復  更多評論
  
# re: 一種線程安全的單例模式實現方式[未登錄]
2010-05-22 07:17 | OnTheWay
@OwnWaterloo
您好,首先感謝您對本隨筆的關注。懇請您說詳細一點,我不太明白哪些地方還不是線程安全的。  回復  更多評論
  
# re: 一種線程安全的單例模式實現方式
2010-05-22 08:57 | OwnWaterloo
@OnTheWay
class S
{
S() { ... }
~S(); { ... }
S(S const&);
S& operator=(S const&S);

public:
static S& instance()
{
static S s;
return s;
}

};

你認為C++(C++03)是否保證S::instance是線程安全的?
如果是, 請說明理由。
如果C++不保證, 是否應該將S::instance作成線程安全的?
  回復  更多評論
  
# re: 一種線程安全的單例模式實現方式
2010-05-22 09:00 | OwnWaterloo
@OnTheWay
再來一種:

class S
{
// ctor, copy, dtor, assignment
static S s_;
public:
S& instance() { return s_; }
};

S S::s_;

同樣是上面的問題。
  回復  更多評論
  
# re: 一種線程安全的單例模式實現方式[未登錄]
2010-05-22 09:12 | OnTheWay
@OwnWaterloo
我覺得不是線程安全的,原因如下:
在你給出的代碼中類S中的函數(雖然現在我還沒有想不出這種函數)可能不是線程安全的。

我的MSN是wwj_5_209@163.com,能否加我一下,我們討論一下。  回復  更多評論
  
# re: 一種線程安全的單例模式實現方式
2010-05-22 14:59 | 匿名
@OwnWaterloo
與博文中的不是一回事。  回復  更多評論
  
# re: 一種線程安全的單例模式實現方式
2010-05-22 19:08 | OwnWaterloo
@OnTheWay
注意兩種需要運行時初始化的靜態對象, s和s_。
前者的初始化時機C++有保證, 但不保證多線程安全。
后者的初始化時機C++只保證同一翻譯單元內中有順序。

再看static CAssistForSingleton m_refSycObj;
這就屬于第2種。

下面的情況有發生的可能性:
1. 另一翻譯單元的靜態對象先于m_refSycObj被初始化
2. 在它初始化時訪問了CSingleton *GetInstatnce()

此時就訪問了一個"未初始化"的臨界區。
這已經是bug。

再有, 如果有下列情況:
1. 一些先于m_refSycObj初始化的代碼開啟了線程
2. 多個線程在m_refSycObj初始化前訪問CSingleton *GetInstatnce()

一個未初始化的m_refSycObj根本不能用于同步。

所以, 上面的第1個問題: 這樣做不是多線程安全的。


而靜態對象在構造時啟動線程的情況并不多, 所以并不一定需要將s_作成多線程安全。
例如boost就是這樣, 要求在進入main之前, 是不許有兩條以上的執行路徑去訪問。
這就是第2個問題。


如果需要完全的多線程安全:
1. 使用once_initial函數(pthread或者win6有提供)
2. 使用"可以靜態初始化"的鎖, 比如pthread_mutex_t就可以
或者自己使用一個spinlock也行。

我沒有msn…… 用gmail的同名郵箱。
  回復  更多評論
  
# re: 一種線程安全的單例模式實現方式
2010-05-22 19:09 | OwnWaterloo
@匿名
知道什么叫"舉一反三"嗎?
  回復  更多評論
  
# re: 一種線程安全的單例模式實現方式[未登錄]
2010-05-22 22:50 | ~
個人一點隨想:我覺得應該從實際應用的邏輯上來進行線程安全的分析,并根據現實情況的分析避免不必要的加解鎖操作。某些代碼只是一種理想化的東西。現實中有太多比SetData復雜的邏輯。而且也不一定需要加鎖。當然從你這個代碼看,GetInstatnce當然是正確的哈。  回復  更多評論
  
# re: 一種線程安全的單例模式實現方式
2010-05-27 00:02 | GunsNRose
傻逼實現也好意思貼出來?丟人現眼  回復  更多評論
  
# re: 一種線程安全的單例模式實現方式[未登錄]
2010-05-27 08:56 | cppexplore
@OnTheWay
c++里的線程安全單例應該是典型的雙重檢測.
文中如此實現的話, 每次調用GetInstatnce都要涉及到加鎖操作, 估計沒人愿意調用.   回復  更多評論
  
# re: 一種線程安全的單例模式實現方式
2010-10-30 14:27 | 楊云召
沒有用volatile,顯然不是線程安全的  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理



<2010年5月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

友情連接

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲日本成人| 亚洲一区二区三区乱码aⅴ| 久热国产精品| 老牛嫩草一区二区三区日本| 激情婷婷欧美| 亚洲高清视频在线观看| 欧美成人四级电影| 一本一道久久综合狠狠老精东影业 | 欧美日韩午夜精品| 亚洲自拍另类| 久久国产福利国产秒拍| 亚洲国产成人午夜在线一区| 亚洲欧洲免费视频| 国产精品高精视频免费| 久久精品国产清高在天天线 | 亚洲视频高清| 性刺激综合网| 99视频热这里只有精品免费| 久久婷婷麻豆| 最新日韩在线| 一本色道久久综合亚洲精品按摩| 国产欧美日韩视频在线观看| 欧美成人午夜| 国产精品久久久久91| 久久综合网hezyo| 欧美激情国产高清| 久久国产欧美| 欧美精品999| 性欧美暴力猛交另类hd| 男女激情久久| 欧美一级二级三级蜜桃| 美女网站久久| 午夜一级久久| 欧美高清在线视频| 久久精品欧洲| 欧美黄色大片网站| 久久精品亚洲精品国产欧美kt∨| 美女视频一区免费观看| 午夜日韩福利| 欧美阿v一级看视频| 久久www免费人成看片高清| 欧美大片在线看| 欧美亚洲一区| 欧美人成免费网站| 免费av成人在线| 国产精品电影网站| 亚洲第一精品影视| 国产毛片一区| 亚洲精品久久久久久下一站| 狠狠色丁香婷婷综合影院| 日韩视频专区| 1000部国产精品成人观看| 亚洲一二三区在线观看| 老巨人导航500精品| 一区久久精品| 亚洲欧美激情一区| 一区二区三区久久| 老**午夜毛片一区二区三区| 久久高清一区| 欧美日韩在线播放一区| 亚洲成人在线视频播放| 国产一级一区二区| 中文在线一区| 一个色综合导航| 久久艳片www.17c.com| 久久成人免费网| 欧美日韩一区二区在线观看| 蜜臀av一级做a爰片久久| 国产伦精品一区二区三区高清版 | 国产在线拍揄自揄视频不卡99 | 亚洲电影在线免费观看| 亚洲一区二区在线免费观看视频| 99精品视频一区| 欧美不卡视频| 久久在线精品| 国产一区自拍视频| 亚洲欧美综合精品久久成人| 亚洲一区二区欧美日韩| 欧美精品v日韩精品v国产精品| 欧美大片第1页| 狠狠色狠狠色综合系列| 午夜国产精品视频免费体验区| 亚洲欧美成人精品| 国产精品theporn88| 日韩视频精品在线| 一区二区不卡在线视频 午夜欧美不卡在| 久久综合狠狠综合久久激情| 国产欧美日韩亚洲精品| 亚洲图中文字幕| 久久视频在线视频| 欧美一区二区三区免费观看| 国产精品久久久亚洲一区| 99天天综合性| 亚洲伊人观看| 欧美日韩另类丝袜其他| 亚洲第一免费播放区| 亚洲人体偷拍| 欧美激情综合亚洲一二区| 欧美激情第三页| 亚洲精品一区二区三区蜜桃久| 免费久久99精品国产自在现线| 久久五月激情| 黄色精品网站| 久久综合五月| 亚洲电影欧美电影有声小说| 亚洲精品久久久久中文字幕欢迎你| 欧美 日韩 国产一区二区在线视频 | 亚洲一区二区黄色| 国产精品高潮呻吟久久av黑人| 在线视频免费在线观看一区二区| 亚洲一区二区三区在线看| 国产精品高潮久久| 午夜精品久久久99热福利| 欧美一区二区三区在| 国产一区二区中文字幕免费看| 久久国产精品一区二区三区| 欧美在线视频免费观看| 国产视频精品免费播放| 久久aⅴ国产紧身牛仔裤| 久久精品综合网| 影视先锋久久| 免费视频一区| 日韩视频免费看| 香蕉久久夜色精品| 韩日视频一区| 欧美成人一二三| 欧美日韩成人综合在线一区二区 | 日韩视频中午一区| 午夜精品成人在线视频| 国产精品欧美一区二区三区奶水| 先锋影音久久久| 蜜臀av性久久久久蜜臀aⅴ| 亚洲人体1000| 国产精品国产三级国产普通话99 | 亚洲综合视频网| 久久久伊人欧美| 在线日本成人| 欧美激情综合五月色丁香| 亚洲视频电影在线| 久久蜜桃av一区精品变态类天堂| 亚洲娇小video精品| 欧美激情91| 亚洲欧美成人综合| 欧美成人在线网站| 一本色道久久99精品综合 | 国产精品久久久久久久久久免费| 香蕉久久久久久久av网站| 欧美88av| 中文亚洲欧美| 国产一区二区三区黄| 老司机凹凸av亚洲导航| 亚洲免费av片| 久久精品视频在线| 亚洲免费激情| 国产日产高清欧美一区二区三区| 美国成人直播| 亚洲精品五月天| 久久精品一本| 一区二区三区 在线观看视| 国产欧美一区二区三区在线老狼| 免费欧美高清视频| 国产农村妇女精品一二区| 久久亚洲美女| 洋洋av久久久久久久一区| 久久综合影视| 亚洲综合国产精品| 亚洲国产精品尤物yw在线观看 | 美日韩精品视频| 亚洲一区在线看| 在线看片欧美| 国产精品久久久一区麻豆最新章节 | 性xx色xx综合久久久xx| 亚洲精品色婷婷福利天堂| 久久免费午夜影院| 亚洲亚洲精品三区日韩精品在线视频| 黄色亚洲免费| 国产精品久久久久久久一区探花| 久久一综合视频| 亚洲在线成人精品| 91久久线看在观草草青青| 久久精品亚洲国产奇米99| 亚洲私拍自拍| 91久久综合| 国产日韩欧美三区| 欧美视频在线观看一区| 久久综合伊人| 欧美一级视频精品观看| 一本色道久久88综合亚洲精品ⅰ| 欧美成人免费全部观看天天性色| 欧美一级在线视频| 一区二区av在线| 亚洲国产欧美日韩| 国产欧美日韩视频在线观看| 欧美日韩免费网站| 美女网站在线免费欧美精品| 欧美在线精品一区| 亚洲一区日韩在线| 99国产精品久久久| 欧美高清不卡在线| 久热综合在线亚洲精品|