免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3430 | 回复: 8

[C++] 单例模式中双重检查的方式在c++里安全吗? [复制链接]

论坛徽章:
0
发表于 2010-04-01 11:17 |显示全部楼层
在java里我知道不安全,ibm的一位工程师分析过:http://www.ibm.com/developerworks/cn/java/j-dcl.html

但在c++里面不知道会不会出现问题?会不会编译器或cpu的乱序也导致这个问题?



test* test::get_instance() {
    if(_this ==  NULL) {
                lock();
                if(_this == NULL) {
                        _this = new test;
                }
    }
    return _this;
}

论坛徽章:
0
发表于 2010-04-01 12:42 |显示全部楼层
C++不存在此问题,如果new test返回test对象,那么构造的test对象一定是完整的

论坛徽章:
0
发表于 2010-04-01 12:54 |显示全部楼层
C++不存在此问题,如果new test返回test对象,那么构造的test对象一定是完整的
tyc611 发表于 2010-04-01 12:42

但是乱序是cpu或编译器造成的,请问c++为何能避免呢?

论坛徽章:
0
发表于 2010-04-01 13:02 |显示全部楼层
但是乱序是cpu或编译器造成的,请问c++为何能避免呢?
wwdwwd 发表于 2010-04-01 12:54

这不是CPU或编译器决定的事情,而是语言规范决定的

论坛徽章:
0
发表于 2010-04-01 13:24 |显示全部楼层
本帖最后由 wwdwwd 于 2010-04-01 13:54 编辑
这不是CPU或编译器决定的事情,而是语言规范决定的
tyc611 发表于 2010-04-01 13:02

你的意思是说:c++告诉编译器或cpu某个命令的几条指令能否乱序执行?
而java里不能用双重检查正是因为java告诉java虚拟机它的_test = new test()命令可以乱序执行,c++里面可以用双重检查是因为c++告诉编译器或cpu它的_test = new test()命令不可以乱序执行,是c++的实现里面对new操作采用rmb/wmb/mb等内存屏障的调用了,对吗?

论坛徽章:
0
发表于 2010-04-01 13:53 |显示全部楼层
回复 5# wwdwwd

Java的语言规范中允许乱序写入,但C++中没有此规定,如果你需要细节可以去参考C++语言规范
另外,在C++中,Double-checked Locking用于Singleton Pattern是很常见的,一些C++ Expert都用,放心用吧

论坛徽章:
0
发表于 2010-04-01 14:10 |显示全部楼层
回复  wwdwwd

Java的语言规范中允许乱序写入,但C++中没有此规定,如果你需要细节可以去参考C++语言规范 ...
tyc611 发表于 2010-04-01 13:53

我觉得允许不允许乱序写入是编译器或cpu的事,c++只能通过设置内存屏障来阻止编译器的乱序优化或cpu的乱序执行,所以如果c++里没有乱序写入的话,必然要在所有的写操作时设置内存屏障,但这应该不是不可能的,因为会减慢cpu的并行指令处理速度

论坛徽章:
0
发表于 2010-04-02 16:32 |显示全部楼层
c++没有这种问题

论坛徽章:
0
发表于 2010-04-03 10:00 |显示全部楼层
c++是没有问题的

ace的作者就把double-checked命名做了一种模式,虽然我不认为这事一种模式。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP