使用就地lambda进行复杂的初始化,尤其是const

就地lambda可以用于复杂的初始化。因此,您可以执行以下操作:

const widget x = [&]{
    widget val;                                // assume that widget has a default constructor
    for (auto i = 2; i <= N; ++i) {            // this could be some
        val += some_obj.do_something_with(i);  // arbitrarily long code
    }                                          // needed to initialize x
    return val; }();

这比写这样的东西要好:

widget x;   // should be const,but:
for (auto i = 2; i <= N; ++i) {             // this could be some
    x += some_obj.do_something_with(i);  // arbitrarily long code
}                                        // needed to initialize x
// from here,x should be const,but we can't say so in code in this style

根据我在此处读到的blog,前一段代码是线程安全的。这避免了必须使用昂贵的同步。因此,您无需在后面的代码中使用互斥锁来确保同步。

我的问题是什么使前一个线程安全?如何运作?

mahate 回答:使用就地lambda进行复杂的初始化,尤其是const

我认为,“博客”是指这样的假设:const对象的使用应仅涉及读取操作,因此应安全地用于多个线程而无需同步。这是该“博客”部分的最后一句话:

  

无法更改其值,因此,您可以在多线程程序中使用它,而无需进行昂贵的同步

但是,这种说法通常是不正确的。如@VTT所指出的,类可以具有mutable成员变量,或例如引用成员变量。因此,不能普遍保证const对象可以在没有同步的情况下安全地用于多线程代码中。

您可能还会注意到,在此问题的上下文中,《 C ++核心准则》中的相应项ES.28根本没有提到多线程。

本文链接:https://www.f2er.com/3168561.html

大家都在问