这个问题让我质疑我多年来一直遵循的做法。
对于函数局部静态 const 对象的线程安全初始化,我保护对象的实际构造,但不保护引用它的函数局部引用的初始化。像这样的东西:
namespace {
const some_type& create_const_thingy()
{
lock my_lock(some_mutex);
static const some_type the_const_thingy;
return the_const_thingy;
}
}
void use_const_thingy()
{
static const some_type& the_const_thingy = create_const_thingy();
// use the_const_thingy
}
这个想法是锁定需要时间,如果引用被多个线程覆盖,那就没关系了。
如果这是我会感兴趣的
- 在实践中足够安全吗?
- 根据规则安全吗?(我知道,当前的标准甚至不知道“并发”是什么,但是践踏已经初始化的引用呢?其他标准,比如 POSIX,是否有与此相关的内容要说?)
我想知道这一点的原因是我想知道我是否可以保留代码原样,或者我是否需要返回并修复它。
对于好奇的头脑:
我使用的许多这样的函数局部静态 const 对象都是在第一次使用时从 const 数组初始化并用于查找的映射。例如,我有一些 XML 解析器,其中标记名称字符串映射到enum
值,因此我可以稍后switch
覆盖标记的enum
值。
由于我得到了一些关于该做什么的答案,但没有得到我实际问题的答案(参见上面的 1. 和 2.),我将对此展开悬赏。再说一遍:
我对我能做什么不感兴趣,我真的很想知道这个。