1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
SingleInstance* volatile
g_instance = NULL; cswuyg::MyCritical g_cs; SingleInstance* GetInstance() { if
(g_instance == NULL) { cswuyg::Lock<> lock(g_cs); if
(g_instance == NULL) { g_instance = new
SingleInstance; } } return
g_instance; } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 |
SingleInstance* volatile
g_instance; LONG
volatile g_for_lock; SingleInstance* GetInstance() { if
(g_instance == NULL) { LONG
pre_value = ::InterlockedExchange(&g_for_lock, 1); if
(pre_value != 0) { while (g_instance == NULL) { ::Sleep(55); } } if
(g_instance == NULL) { g_instance = new
SingleInstance; } } return
g_instance; } |
全局的g_for_lock在PE文件装入内存时就初始化为0,所以不存在初始化问题;InterlockedExchange 适用于xp、win7、win8,不存在系统限制;多个线程同时调用InterlockedExchange,只能有一个线程得到0,保证只初始化一次,其余线程进入while循环等待,直到g_point非空。问题不逼你,你就不会想到还有这么好的实现思路 :)
使用原子操作还可以很容易的实现临界区锁的功能,这里就不说了。
Double Check 相关资料(主要是说java的执行指令调整导致DoubleCheck思路失效):
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
http://zh.wikipedia.org/wiki/%E5%8F%8C%E9%87%8D%E6%A3%80%E6%9F%A5%E9%94%81%E5%AE%9A%E6%A8%A1%E5%BC%8F
Singleton、MultiThread、Lib——实现单实例多线程安全API遇到的问题,布布扣,bubuko.com
Singleton、MultiThread、Lib——实现单实例多线程安全API遇到的问题
原文:http://www.cnblogs.com/cswuyg/p/3575022.html