9
C ++中高效的线程安全单例
单例课程的通常模式如下 static Foo &getInst() { static Foo *inst = NULL; if(inst == NULL) inst = new Foo(...); return *inst; } 但是,据我了解,此解决方案不是线程安全的,因为1)Foo的构造函数可能被多次调用(可能无关紧要),并且2)inst在返回到另一个线程之前可能未完全构建。 一种解决方案是在整个方法周围包裹一个互斥体,但是在我真正需要同步后很长一段时间内,我就要为同步开销付出代价。另一种方法是 static Foo &getInst() { static Foo *inst = NULL; if(inst == NULL) { pthread_mutex_lock(&mutex); if(inst == NULL) inst = new Foo(...); pthread_mutex_unlock(&mutex); } return *inst; } 这是正确的方法,还是我应该注意的陷阱?例如,是否可能发生任何静态初始化顺序问题,即inst总是在首次调用getInst时始终保证为NULL?