青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
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年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?)(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
博客園
模板提供:
滬江博客
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
亚洲日本成人
|
亚洲一区二区三区乱码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国产精品久久久
|
欧美高清不卡在线
|
久热综合在线亚洲精品
|