【发布时间】:2011-02-26 17:00:05
【问题描述】:
This question 让我质疑我多年来一直遵循的做法。
对于函数局部静态常量对象的线程安全初始化,我保护对象的实际构造,但不保护函数局部的初始化参考 指它。像这样的:
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.),我将开始对此进行赏金。再说一遍:
我对我能做什么而不是感兴趣,我真的很想知道这个。
【问题讨论】:
-
我看不出您的问题与您引用的问题有何显着不同。以前不是以一种或另一种形式多次问过这个问题吗?例如,stackoverflow.com/questions/1270927/…。
-
@Neil:我不是在问一般的双重检查锁定等,而是特别是关于不保护简单地址的分配。我没有找到任何关于此的信息,但如果它存在,我很乐意参考它。
标签: c++ concurrency multithreading static-initialization