青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
OnTheWay2012
埋葬昨天的我,迎來重生的我!
C++博客
首頁
新文章
新隨筆
聚合
管理
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
8
using
namespace
std;
9
10
class
CSingleton
11
{
12
private
:
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
41
private
:
42
static
CAssistForSingleton m_refSycObj;
43
static
CSingleton
*
m_pInstance;
44
45
static
int
m_nData;
46
47
private
:
48
CSingleton()
49
{
50
51
}
52
53
public
:
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
67
public
:
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
81
CSingleton::CAssistForSingleton CSingleton::m_refSycObj
=
CSingleton::CAssistForSingleton();
82
CSingleton
*
CSingleton::m_pInstance
=
NULL;
83
int
CSingleton::m_nData
=
0
;
84
85
unsigned
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
103
int
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年6月
>
日
一
二
三
四
五
六
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
常用鏈接
我的隨筆
我的評論
我參與的隨筆
留言簿
(4)
給我留言
查看公開留言
查看私人留言
隨筆分類
C、C++(2)
操作系統(Windows、Linux、Unix)
讀書筆記
個人感悟(4)
面經 (4)
軟件設計(1)
數據庫
算法(3)
線程、進程
英語
雜項
轉載
隨筆檔案
2011年1月 (1)
2010年12月 (2)
2010年11月 (1)
2010年6月 (1)
2010年5月 (6)
2010年4月 (1)
2010年3月 (3)
友情連接
搜索
最新評論
1.?re: 對“隨筆”所寫的一篇文章《鏈表實驗》的一點看法
評論內容較長,點擊標題查看
--陳梓瀚(vczh)
2.?re: 對“隨筆”所寫的一篇文章《鏈表實驗》的一點看法
謝謝咯,呵呵。我喜歡這代碼風格,向你學習
--あ維wêiセ
3.?re: 一種基于引用計數機制的智能指針實現
把A *p = new A();這句換成A p;不行嗎?
--叫我老王吧
4.?re: 一種基于引用計數機制的智能指針實現
Boost 里面有,在C++ TR1 里面也已經有這種指針(就是來自Boost)
--Phuehvk
5.?re: 一種基于引用計數機制的智能指針實現[未登錄]
比較討厭這種引用計數指針的使用,一旦使用就意味這在所有的函數參數中必須使用指針引用或者值拷貝,一旦某些函數要求用裸指針,就可能引發問題。
--hdqqq
閱讀排行榜
1.?一道面試題(求一個unsigned int 數的二進制表示中有多少個1?)(6210)
2.?一種線程安全的單例模式實現方式(5786)
3.?一種基于引用計數機制的智能指針實現(2967)
4.?不要把類的外衣脫下來,讓類的美麗消失于無形(2819)
5.?幾道面試題,有的做出來了,有的不會做,請大家指教(2656)
評論排行榜
1.?一道面試題(求一個unsigned int 數的二進制表示中有多少個1?)(15)
2.?一種線程安全的單例模式實現方式(15)
3.?幾道面試題,有的做出來了,有的不會做,請大家指教(14)
4.?令人氣憤的現象(13)
5.?不要把類的外衣脫下來,讓類的美麗消失于無形(9)
Copyright ©2025 OnTheWay Powered By
博客園
模板提供:
滬江博客
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
欧美激情欧美狂野欧美精品
|
欧美日韩久久精品
|
久久久精品一区二区三区
|
午夜免费电影一区在线观看
|
亚洲免费在线观看
|
羞羞色国产精品
|
久久成年人视频
|
久久久综合精品
|
开心色5月久久精品
|
欧美成人国产
|
欧美日韩中字
|
国产精品一区一区三区
|
国产一区二区三区四区
|
激情久久久久久久
|
亚洲精品一区二区三区蜜桃久
|
欧美成人免费观看
|
欧美成人午夜77777
|
欧美日韩在线精品
|
国产欧美日韩一级
|
一区在线免费观看
|
日韩天堂在线视频
|
亚洲欧美在线一区
|
久久综合色婷婷
|
91久久久久久
|
亚洲在线观看视频网站
|
久久精品视频播放
|
欧美久久电影
|
国产一区久久
|
99国产精品久久久久久久久久
|
亚洲欧美另类在线观看
|
老司机午夜精品视频
|
亚洲人久久久
|
欧美伊久线香蕉线新在线
|
欧美成人免费一级人片100
|
国产精品成人一区二区三区吃奶
|
国内成+人亚洲
|
亚洲另类在线一区
|
国产精品久久久久久影视
|
亚洲一区在线看
|
国产日韩免费
|
欧美激情中文字幕在线
|
久久久久久亚洲综合影院红桃
|
欧美专区一区二区三区
|
亚洲激精日韩激精欧美精品
|
欧美中文字幕第一页
|
欧美大片一区二区
|
国产一区二区三区四区老人
|
欧美一区二区三区视频免费
|
伊人色综合久久天天
|
午夜综合激情
|
久久久97精品
|
欧美不卡在线
|
久久中文久久字幕
|
国产亚洲欧美日韩在线一区
|
先锋影音久久久
|
久久精品一区二区国产
|
久久野战av
|
国产精品自拍小视频
|
久久久久se
|
国产精品高潮呻吟视频
|
国内外成人在线
|
久久久综合精品
|
久久久国产成人精品
|
欧美高清一区二区
|
亚洲最新色图
|
国产一区二区三区四区五区美女
|
亚洲在线中文字幕
|
亚洲一区二区三区免费在线观看
|
最新日韩欧美
|
亚洲精品久久久久久下一站
|
亚洲永久免费av
|
欧美电影免费
|
一区二区不卡在线视频 午夜欧美不卡在
|
亚洲欧美日韩一区二区
|
欧美aⅴ99久久黑人专区
|
亚洲视屏在线播放
|
欧美激情视频在线播放
|
亚洲一级特黄
|
久久久久一区二区
|
亚洲欧美日韩一区
|
欧美日韩国产小视频
|
欧美一级片久久久久久久
|
宅男噜噜噜66一区二区
|
国产欧美日韩另类视频免费观看
|
国产综合18久久久久久
|
国产精品国产精品
|
国产精品日本
|
亚洲国产高清自拍
|
亚洲黄色影院
|
日韩视频在线观看免费
|
欧美成人精品1314www
|
激情av一区二区
|
狼人社综合社区
|
久久久久久亚洲精品中文字幕
|
国语精品中文字幕
|
久久影院午夜片一区
|
久久精品国产久精国产爱
|
狠狠爱综合网
|
久久米奇亚洲
|
久久久久一区
|
亚洲国产毛片完整版
|
在线播放视频一区
|
你懂的视频欧美
|
蜜桃视频一区
|
亚洲免费电影在线
|
一本色道久久综合狠狠躁篇怎么玩
|
欧美国产激情二区三区
|
日韩视频―中文字幕
|
日韩午夜免费
|
国产精品系列在线播放
|
久久精品亚洲精品国产欧美kt∨
|
久久成年人视频
|
亚洲国产一区二区三区a毛片
|
亚洲黄色性网站
|
欧美视频在线观看免费
|
久久爱www久久做
|
久久久999
|
日韩视频在线免费
|
亚洲网站在线观看
|
极品日韩久久
|
亚洲茄子视频
|
国产精品丝袜xxxxxxx
|
久久夜色精品国产欧美乱
|
欧美夫妇交换俱乐部在线观看
|
亚洲视频在线看
|
欧美一区二区三区在线视频
|
亚洲欧洲精品一区
|
亚洲午夜91
|
在线观看三级视频欧美
|
日韩亚洲国产精品
|
国产一区二区三区四区五区美女
|
亚洲精品影视在线观看
|
国产精品自在线
|
欧美二区不卡
|
国产精品激情偷乱一区二区∴
|
久久亚洲欧美
|
欧美日韩小视频
|
久久综合电影
|
欧美日韩综合视频
|
鲁大师成人一区二区三区
|
欧美日韩国产va另类
|
久久国内精品视频
|
欧美另类一区二区三区
|
久久精视频免费在线久久完整在线看
|
欧美1区免费
|
欧美亚洲一区三区
|
欧美国产亚洲另类动漫
|
久久成人18免费观看
|
欧美久久久久久久
|
久久手机精品视频
|
国产精品盗摄久久久
|
欧美88av
|
国产毛片一区二区
|
亚洲精品一区二区三区不
|
国产在线不卡
|
一本一本a久久
|
亚洲激情婷婷
|
久久av资源网站
|
亚洲午夜激情网页
|
欧美 日韩 国产在线
|
久久精品一区
|
国产精品sm
|
亚洲人久久久
|
亚洲高清一区二
|
欧美一区影院
|
午夜欧美大尺度福利影院在线看
|
免费看亚洲片
|
久久偷看各类wc女厕嘘嘘偷窃
|
国产精品久久久久久影视
|
亚洲经典三级
|
91久久精品美女高潮
|
久久精品日产第一区二区
|
先锋影音一区二区三区
|
欧美午夜美女看片
|
亚洲欧洲一区二区三区久久
|
在线成人黄色
|
久久国产精品久久久久久电车
|
午夜精品免费在线
|
欧美日韩在线播
|
亚洲老司机av
|
亚洲美女中文字幕
|
免费在线看成人av
|
欧美成人一区二区
|
亚洲二区在线视频
|
久久久99国产精品免费
|
久久久伊人欧美
|
国产亚洲va综合人人澡精品
|
亚洲一区在线看
|
亚洲欧美影院
|
国产精品日韩在线观看
|
亚洲特级片在线
|
亚洲综合色网站
|
国产精品国产精品国产专区不蜜
|
99热免费精品
|
亚洲夜间福利
|
国产精品久久久久久亚洲毛片
|
黄色成人在线观看
|
欧美在线免费观看
|
久久久久久网站
|
影音先锋欧美精品
|