Web Analytics
yangyang

码农兼一个普普通通小青年

reorder


编译器对代码的重排序对程序可能产生的影响

编译器在编译代码或者CPU在执行代码的时候,为了提高编译器和处理器的执行性能,编译器和处理器会对指令重排(reorder)序。 编译器优化的重排序是在编译时期完成的,指令重排序和内存重排序是在CPU运行时进行的。通常情况下,重排序不会产生什么问题,但在涉及到多线程时,可能会遇到问题。本文列举了两个例子来说明编译器重排序,可能对程序造成错误。第一个例子是经典的双检锁,编译器对代码的重排序可能会多线程模式下的代码产生意向不到的错误,这个时候就需要同步锁来强制代码按照我们要求的方式来生成。第二个例子是在使用智能指针管理资源对象时可能产生的资源泄露,编译器的重排序,可能会使得原始对象创建后,和把对象放到智能指针之间会被插入其它的操作,如果这些操作抛出了异常,那么创建出来的原始对象的指针就会丢失,从而产生资源泄露。所以在编写多线程代码以及在对原始资源进行管理的时候,要注意以上问题。 …

Singleton volatile reorder double-check locking lazy initialization

  • 1