您的位置:首页 > 其它

单例模式的多线程极端问题

2010-03-24 15:43 204 查看
刚刚同事贴了一个代码:

volatile T* pInst = 0;
T* GetInstance()
{
if (pInst == NULL)
{
lock();
if (pInst == NULL)
pInst = new T;
unlock();
}
return pInst;
}
上面那段代码是单例模式的一个实现,多线程并发时候会不会有问题?

大牛的答案是,可能会有问题
原因在于编译器的实现与优化。如果,pInst = new T;转换成机器码时,是先将分配的地址空间赋值给pInst,(这时可能其他线程获取了pInst)然后再进行对象的初始化,可能其他线程调用的时候得到的是一个尚未进行初始化的对象...要解决这个问题就要用cpu的栅栏指令,阻止编译器调整机器码序列

代码如下:

#define barrier() __asm__ volatile ("lwsync")//powerpc提供的栅栏指令 volatile T* pInst = 0;
T* GetInstance()
{
if (pInst == NULL)
{
lock();
if (pInst == NULL)
T* temp = new T;
barrier();
pInst = temp;
unlock();
}
return pInst;
} 这样的问题估计VC或者GCC都不会有问题,但不保证其他编译会不会出问题。问题来自:程序员的自我修养 那本书第一章
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: