Effective C++ 条款04中有关local static对象的reference-returning函数的疑问?

在条款04中,为了解决不同编译单元中的non-local static对象的初始化次序的不确定性,作者提倡使用函数中的static对象,也就是loca…
关注者
15
被浏览
2,645
登录后你可以
不限量看优质回答私信答主深度交流精彩内容一键收藏

不会分配多个,只不过有可能会对同一个local static构造多次。两个线程,如果同时调用这个包含local static对象的函数,它们都会认为这个对象还没有被构造过,所以会构造两次。

Effective C++里说的手动调用一次函数,只是保证初始化只进行一次,并不能保证之后没有问题。比如

int& foo()
{
     static int x;
     return x;
}

两个线程如果同时调用foo()+=100,可能一个线程在执行foo()+100,还没有把结果赋值给foo(),另一个线程又执行了,最后导致了static int x只增加了100,而不是200。这就是

Race condition

,题主可以看看多线程的同步方面的知识,在此就不加赘述了。

Effective C++里描述的问题的根源不是这个函数的问题,而是non-const static对象(全局或者局部)本身在多线程里会出现的问题,而书中的手动调用方式,解决的也只是初始化时的race condition。non-const static对象的race condition可以通过信号量等方法来解决,但是正如书中所说,除非必要,让一个线程等待另一个线程完成操作不是一个好主意。