单例模式的多线程极端问题
刚刚同事贴了一个代码:
上面那段代码是单例模式的一个实现,多线程并发时候会不会有问题?
大牛的答案是,可能会有问题
原因在于编译器的实现与优化。如果,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都不会有问题,但不保证其他编译会不会出问题。
问题来自:程序员的自我修养 那本书第一章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库