仔细检查锁定模式 - 在传递给call_once的lambda中捕获

时间:2018-02-05 12:29:59

标签: c++ c++11 lambda std-call-once

我正在观看Herb Sutter的CppCon 2014谈论无锁编程。

handout page 7上,我们有以下代码:

static unique_ptr<widget> widget::instance;
static std::once_flag widget::create;

widget& widget::get_instance() {
    std::call_once( create, [=]{ instance = make_unique<widget>(); } );
    return *instance;
}

我的问题:为什么在这里使用[=]捕获,而不是[&](或者只是[]?)

cppreference说:

  

[=]通过复制捕获lambda体中使用的所有自动变量,如果存在,则通过引用捕获当前对象

但我们没有任何自动变量,也不需要当前的对象。

1 个答案:

答案 0 :(得分:0)

这里不需要 capture-default []会做得很好。

正如我在评论中所写,这是一个未经测试的片段,用于说明完全不相关的事情(即call_once)。尝试阅读太多内容并没有多大意义。

也就是说,就“编写适合幻灯片的未经测试的片段”而言,[=]可能是最安全的默认 lambda-introductioncer :{{1}如果您需要捕获,可能会导致数据争用或悬空引用,[&]会出错,而显式捕获会占用幻灯片上的宝贵空间 - 并且需要实际考虑捕获......