青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
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
閱讀(5779)
評論(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 |
~
個人一點隨想:我覺得應該從實際應用的邏輯上來進行線程安全的分析,并根據現實情況的分析避免不必要的加解鎖操作。某些代碼只是一種理想化的東西?,F實中有太多比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,顯然不是線程安全的
回復
更多評論
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
【推薦】100%開源!大型工業跨平臺軟件C++源碼提供,建模,組態!
網站導航:
博客園
IT新聞
BlogJava
博問
Chat2DB
管理
<
2010年5月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
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
31
1
2
3
4
5
常用鏈接
我的隨筆
我的評論
我參與的隨筆
留言簿
(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?)(6193)
2.?一種線程安全的單例模式實現方式(5779)
3.?一種基于引用計數機制的智能指針實現(2956)
4.?不要把類的外衣脫下來,讓類的美麗消失于無形(2805)
5.?幾道面試題,有的做出來了,有的不會做,請大家指教(2643)
評論排行榜
1.?一道面試題(求一個unsigned int 數的二進制表示中有多少個1?)(15)
2.?一種線程安全的單例模式實現方式(15)
3.?幾道面試題,有的做出來了,有的不會做,請大家指教(14)
4.?令人氣憤的現象(13)
5.?不要把類的外衣脫下來,讓類的美麗消失于無形(9)
Copyright ©2025 OnTheWay Powered By
博客園
模板提供:
滬江博客
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
亚洲国产精品精华液2区45
|
欧美久久久久免费
|
国产乱肥老妇国产一区二
|
亚洲综合激情
|
性欧美videos另类喷潮
|
激情国产一区二区
|
欧美激情欧美激情在线五月
|
欧美国产精品一区
|
亚洲天堂网站在线观看视频
|
亚洲欧美日韩精品久久久久
|
国产一区欧美日韩
|
亚洲成色精品
|
欧美午夜精品久久久久久人妖
|
亚洲一区在线视频
|
亚洲久色影视
|
久久精品卡一
|
久久视频一区
|
亚洲视频一二
|
欧美专区在线播放
|
亚洲精品乱码久久久久久
|
亚洲一区二区三区在线看
|
国内精品久久久久国产盗摄免费观看完整版
|
老鸭窝毛片一区二区三区
|
欧美激情bt
|
久久久综合视频
|
欧美日韩福利
|
久久婷婷麻豆
|
欧美视频日韩视频
|
欧美暴力喷水在线
|
国产精品日本欧美一区二区三区
|
农村妇女精品
|
国产精品亚洲精品
|
亚洲青色在线
|
在线精品福利
|
午夜在线成人av
|
在线视频欧美日韩精品
|
久久精品五月
|
欧美在线3区
|
欧美日韩亚洲综合在线
|
欧美成人精品影院
|
国产一区二区三区在线观看免费视频
|
亚洲黄色av一区
|
精品成人一区
|
欧美一区二区三区精品
|
亚洲欧美成人一区二区在线电影
|
美日韩免费视频
|
美国成人毛片
|
国产在线成人
|
久久福利视频导航
|
午夜精品久久久久久久99热浪潮
|
欧美精品色网
|
亚洲国产成人av好男人在线观看
|
国产中文一区
|
欧美亚洲网站
|
久久精品一区二区三区四区
|
国产精品视频网站
|
亚洲视频导航
|
亚洲综合大片69999
|
欧美日韩中文精品
|
亚洲毛片在线看
|
一本色道久久综合亚洲精品婷婷
|
欧美一区视频
|
国产精品www网站
|
一区二区日韩伦理片
|
中国av一区
|
国产精品theporn
|
亚洲一区二区视频在线
|
午夜久久tv
|
国产欧美日韩视频一区二区三区
|
麻豆精品视频在线观看
|
一区二区三区在线看
|
久久蜜桃精品
|
亚洲二区精品
|
亚洲视频精品
|
欧美午夜精品久久久久久超碰
|
一区二区三区精品在线
|
香蕉久久一区二区不卡无毒影院
|
国产精品免费一区二区三区观看
|
亚洲一区精品在线
|
久久嫩草精品久久久精品一
|
久久久五月婷婷
|
亚洲成人原创
|
欧美日韩视频在线一区二区
|
国产欧美日韩91
|
欧美在线日韩
|
亚洲国产经典视频
|
亚洲图片欧洲图片av
|
国产精品私拍pans大尺度在线
|
亚洲欧美中文另类
|
免费在线成人av
|
一区二区三区四区五区精品视频
|
国产精品高潮视频
|
久久精品人人做人人爽
|
亚洲欧洲精品一区二区三区波多野1战4
|
国产精品美女999
|
久久精品亚洲热
|
亚洲精品免费在线播放
|
久久av红桃一区二区小说
|
亚洲国产精品尤物yw在线观看
|
欧美日韩另类字幕中文
|
久久岛国电影
|
亚洲午夜高清视频
|
欧美成人免费播放
|
欧美亚洲三区
|
99国产精品99久久久久久
|
国产女主播一区
|
欧美伦理91i
|
久久成人亚洲
|
亚洲天堂久久
|
亚洲国产三级在线
|
久久偷窥视频
|
欧美一级黄色网
|
亚洲伦伦在线
|
在线观看欧美日本
|
国产精品视频导航
|
欧美精品在线网站
|
玖玖在线精品
|
久久成人精品一区二区三区
|
中国成人亚色综合网站
|
亚洲黄色一区二区三区
|
久久天天狠狠
|
久久不射中文字幕
|
亚洲自拍电影
|
中文精品视频
|
一卡二卡3卡四卡高清精品视频
|
一区在线播放
|
国内精品一区二区三区
|
国产精品一区二区三区四区
|
欧美一区在线看
|
亚洲中字在线
|
一级成人国产
|
99国产精品自拍
|
亚洲伦理在线免费看
|
亚洲福利一区
|
亚洲黄页一区
|
亚洲黄色小视频
|
亚洲精品美女
|
亚洲精品乱码久久久久久日本蜜臀
|
亚洲电影在线播放
|
欧美福利精品
|
亚洲激情中文1区
|
亚洲成人直播
|
亚洲国产精品欧美一二99
|
免费亚洲电影在线
|
蜜桃久久精品乱码一区二区
|
久久亚洲影院
|
欧美成年人视频网站欧美
|
欧美aⅴ99久久黑人专区
|
蜜臀va亚洲va欧美va天堂
|
免费毛片一区二区三区久久久
|
开心色5月久久精品
|
女同一区二区
|
亚洲精品久久嫩草网站秘色
|
亚洲深夜福利
|
性刺激综合网
|
玖玖玖国产精品
|
欧美www视频
|
亚洲乱码一区二区
|
亚洲一区三区在线观看
|
亚洲欧美综合v
|
久久琪琪电影院
|
欧美—级高清免费播放
|
欧美日韩中文字幕在线
|
国产精品主播
|
在线观看欧美日本
|
一本色道久久99精品综合
|
亚洲一区二区三区三
|
欧美在线观看视频
|
欧美激情一区二区三级高清视频
|
亚洲精品一区二区三区不
|
亚洲欧美美女
|
美女精品在线
|
国产精品久久久久高潮
|
一色屋精品视频免费看
|
99精品欧美一区二区三区
|
午夜在线电影亚洲一区
|
免费欧美在线视频
|
这里只有精品视频在线
|
欧美在线免费
|
欧美日韩精品免费观看视频完整
|
国产精品亚发布
|
亚洲精品在线一区二区
|
久久激情综合网
|
亚洲人午夜精品
|
久久久999国产
|
国产精品国产三级国产aⅴ9色
|
狠狠干综合网
|
亚洲一区二区三区四区在线观看
|
午夜视频久久久久久
|
欧美国产第二页
|
激情偷拍久久
|
午夜精品三级视频福利
|
亚洲国产日日夜夜
|
久久久久成人精品免费播放动漫
|
欧美午夜电影在线
|
亚洲电影有码
|
久久一区二区视频
|
亚洲免费中文
|
欧美午夜精品理论片a级大开眼界
|
亚洲国产美女精品久久久久∴
|