Web Analytics
yangyang

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

volatile


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

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

Singleton volatile reorder double-check locking lazy initialization

C#中的线程同步构造:用户模式构造和内核模式构造

当多个线程同时访问共享数据对象时,就需要线程同步,以保证数据状态不会被破坏。线程同步的通常做法是加“锁”,以保证某一时刻只有拥有这个锁的对象才能够去操作数据。加“锁”能够保证共享数据不会被破坏,但是它增加了代码的复杂性,并且有时候不容易测试和重现。另外“锁”增加了系统开销,会损害系统性能。本文介绍了C#中的基元用户模式构造和基元内核模式构造两类基本类型构造,并详细介绍了在C#中的实现。 …

ManualResetEvent user-mode kernel-mode volatile interlocked OCC WaitHandle AutoResetEvent Semaphore Mutex

  • 1