网站推广手段有哪些网页设计心得体会600
网站推广手段有哪些,网页设计心得体会600,济南建站公司模板,电子商务网站的基础建设问题 在设计模式中#xff0c;有一个很经典的模式-单例模式#xff0c;它可能是实现上最简单的模式#xff0c;在代码中也经常使用#xff0c;在单线程下#xff0c;毫无疑问延迟化加载是比较常用的#xff0c;但是在多线程条件下#xff0c;单例模式的延迟加载可能就会… 问题 在设计模式中有一个很经典的模式-单例模式它可能是实现上最简单的模式在代码中也经常使用在单线程下毫无疑问延迟化加载是比较常用的但是在多线程条件下单例模式的延迟加载可能就会出现一些问题。
如以下的代码
T* GetInstance()
{if (pInst NULL){pInst new T;}return pInst;
}如果检测代码和实例化代码不是同一线程则很容易出现返回NULL的现象。 经典的单例模式下的双重检测 解决以上问题就是加并发锁我们将需要实例化的对象加锁于是有了以下代码
T* GetInstance()
{if (pInst NULL){lock();if (pInst NULL)pInst new T;unlock();}return pInst;
}为什么要用两层if检查第一层的if检查是因为当实例为空的时候才去对实例加锁这样可以避免多次对lock资源的调用当第二层if检测的时候才是程序要对程序进行初始化。
乍看这种代码是没有问题的但是问题的来源是CPU的乱序执行C的New操作实际上包含了两个步骤
分配内存调用构造函数
所以pInst new T包含了三个步骤
分配内存在内存的位置上调用构造函数将内存的地址赋值给pInst
因为(2)和(3)是可以颠倒的所以可以出现这样的情况pInst的值已经不是NULL但对象仍然没有构造完毕。如果另外一个线程对GetInstance的调用此时第一个if为false这样就会返回一个未构造完成的对象此时可能会导致程序崩溃。 解决思路 许多体系结构都提供barrier指令POWERPC提供了其中一条名为lwsync的指令我们可以这样来保证线程安全:
#define barrier() __asm__ volatile (lwsyc)
volatile T* pInst 0;
T* GetInstance()
{if (!pInst) {lock();if (!pInst){T* temp new T;barrier()pInst temp;}unlock();}return pInst;
}由于barrier的存在对象的构造一定会在barrier执行之前完成所以这样不会出现一些问题。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/85500.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!