关于Effective C++第三版 条款4的疑惑
在scott meyers的effective C++第三版中的条款4,下面段话.
"任何一种non-const static对象,不论它是local或non-local,在多线程环境下'等待某事发生'都会有麻烦.处理这个麻烦的一种做法是:在程序的单线程启动阶段手工调用reference-returning函数,这可消除与初始化有关的race conditions"
对于local static object 确实如此,可是全局,域内或者类内静态变量都会在进入main函数之前初始化。为什么还要加上non-local呢? 及为什么只有const static 对象又可以呢?请各位帮忙给点参考:
[解决办法]
作者不是说初始化你的静态对象,而是你的一个全局对象需要利用本地静态对象初始化,而且你的书也翻译错了.
作者的原话是"Then again, any kind of non-const static object — local or non-local — is trouble waiting to happen in the presence of multiple threads. "
is trouble waiting to hanppen(It is the trouble that is waiting to arise)说是任何non-const的静态对象在多线程的情况下,都是容易引起麻烦.而不是"等待某事发生"
原因很简单,作者说是利用返回本地静态对象来正确保证模块间的全局对象初始化顺序.
Directory& tempDir()
{
static Directory td; // define/initialize local static object
return td; // return reference to it
}
假如你的一个对象(全局不全局无关),需要依赖non-const Directory对象进行初始化.比如
线程1:
string name = tempDir().GetCurrentDirectName() ;
线程2:
tempDir().SetLocation( "x:\\y" ) //改变了目录
string name = tempDir().GetCurrentDirectName() ;
线程1可能在执行tempDir()以后,被线程2抢占了CPU,线程2会改变当前的目录位置,所以这样就导致
线程1和2的name都得到相同的directory name,这对线程1来说是错误的.
而const static对象没有这种问题,因为你不能改变const对象的数据.
因为你这里是non-static 所以作者最后让你在全局对象最好在程序运行初期,在单线程的环境下对你的全局变量进行依次初始化.