双检查锁模式 - 捕获在lambda中传递给call_once

Double-check lock pattern - capture in lambda passed to call_once

本文关键字:call once lambda 检查 模式      更新时间:2023-10-16

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

在讲义第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主体中使用的所有自动变量,如果存在,则通过复制和当前对象(如果存在(

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

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

正如我在评论中所写的那样,这是一个未经测试的摘要,以说明完全无关的东西(即call_once(。试图读太多的内容没有太多要点。

也就是说,就"未经测试的摘要为适合幻灯片的片段"而言,[=]可能是最安全的默认值 lambda-Indroducer [&]可能会导致数据竞赛或悬而未决的参考文献,如果您需要捕获并明确捕获在幻灯片上占用宝贵的空间,则[]是错误的 - 需要实际考虑捕获……